home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 010a / dietdisc.zip / DIETDISK.ASM < prev    next >
Assembly Source File  |  1991-02-10  |  176KB  |  5,992 lines

  1.  
  2. ;-----------------------------------------------------------------;
  3. ;                                                                 ;
  4. ;       DietDisk   Version 1.0                                    ;
  5. ;                                                                 ;
  6. ;       Copyright (c) 1990 Barry Nance                            ;
  7. ;       Released to the Public Domain                             ;
  8. ;                                                                 ;
  9. ;       Distributed from BIX, the BYTE Magazine Information       ;
  10. ;       Exchange                                                  ;
  11. ;                                                                 ;
  12. ;-----------------------------------------------------------------;
  13.  
  14. CallDOS         Macro   _func
  15.                 Mov     AH, _func
  16.                 PushF
  17.                 CLI
  18.                 Call    CS:OldInt21
  19.                 EndM
  20.  
  21. ;-----------------------------------------------------------------;
  22. ;       Equates                                                   ;
  23. ;-----------------------------------------------------------------;
  24.  
  25. StdOut          =       0001            ;file handle for StdOut
  26. MaxName         =       80              ;max size of a filename
  27. MaxHandles      =       10              ;max number of file handles we do
  28. MaxBuf          =       2048            ;buffer size
  29. NumPtrs         =       250             ;number of ptrs on a ptr rec
  30. MaxTextBuf      =       1024            ;text buffer size
  31.  
  32. ;       equates for DOS operations
  33.  
  34. DiskReset       =       0Dh
  35. FCBOpenOp       =       0Fh
  36. FCBCloseOp      =       10h
  37. FCBSeqReadOp    =       14h
  38. FCBSeqWriteOp   =       15h
  39. FCBCreateOp     =       16h
  40. FCBRandReadOp   =       21h
  41. FCBRandWriteOp  =       22h
  42. FCBFileSizeOp   =       23h
  43. FCBRelRecOp     =       24h
  44. FCBBlockReadOp  =       27h
  45. FCBBlockWriteOp =       28h
  46. CurrentDiskOp   =       19h
  47. SetDTAOp        =       1Ah
  48. GetDTAOp        =       2Fh
  49. GetVerOp        =       30h
  50.  
  51. SetVectorOp     =       25h
  52. GetVectorOp     =       35h
  53. CreateOp        =       3Ch
  54. OpenOp          =       3Dh
  55. CloseOp         =       3Eh
  56. ReadOp          =       3Fh
  57. WriteOp         =       40h
  58. DeleteOp        =       41h
  59. SeekOp          =       42h
  60. IOCTL           =       44h
  61. DupeHandOp      =       45h
  62. ForceDupeOp     =       46h
  63. GetCurrDir      =       47h
  64. ExecPgmOp       =       4Bh
  65. CreateNewOp     =       5Bh
  66. LockOp          =       5Ch
  67. CommitOp        =       68h
  68. Term00Op        =       00h
  69. Term31Op        =       31h
  70. Term4COp        =       4Ch
  71. FDateTimeOp     =       57h
  72.  
  73.  
  74. ;       equates for Lempel/Ziv/Welch compression/decompression
  75.  
  76. clear           =       256             ;Clear code
  77. eof             =       257             ;End of file marker
  78. first_free      =       258             ;First free code
  79. maxmax          =       1024            ;Max code + 1
  80. K512            =       512
  81. K256            =       256
  82. K10             =       10
  83. K9              =       9
  84.  
  85. ;-----------------------------------------------------------------;
  86. ;       Physical beginning of program                             ;
  87. ;-----------------------------------------------------------------;
  88.  
  89. PSP             Segment
  90.                 Assume  CS:PSP, DS:PSP, ES:PSP
  91.                 Org     100h
  92.  
  93. Program:        Jmp     Start
  94.  
  95. ;-----------------------------------------------------------------;
  96. ;       Data area                                                 ;
  97. ;-----------------------------------------------------------------;
  98.  
  99. AskFlag         DW      0
  100. Banner          DB      "Diet Disk V1.0"
  101.  
  102. DietDir         DB      "Diet.Dir"
  103.                 DB      0
  104. LDietDir        =       $ - DietDir
  105.  
  106. DietPath        DB      MaxName dup(0)
  107. DietDirHandle   DW      ?
  108.  
  109. DeCompPID       DW      0
  110. DeCompHandle    DW      0
  111. DeCompFilePos   DD      0
  112. DeCompBlock     DW      0FFFFh          ; force it to be read 1st time
  113. DeCompDirty     DW      0
  114.  
  115. OldPID          DW      ?
  116. CurrHandle      DW      ?
  117. CurrFilePos     DD      ?
  118. CurrBlock       DW      ?
  119. BlockPos        DW      ?
  120.  
  121. OldInt21        Label   DWord
  122. OldInt21Ofs     DW      ?
  123. OldInt21Seg     DW      ?
  124.  
  125. OldInt20        Label   DWord
  126. OldInt20Ofs     DW      ?
  127. OldInt20Seg     DW      ?
  128.  
  129. OldSP           DW      ?
  130. OldSS           DW      ?
  131. OurSP           DW      ?
  132. OurSS           DW      ?
  133. Junk            DW      ?
  134.  
  135. OurPID          DW      ?
  136. CtrlHandle      DW      ?
  137. CtrlPID         DW      ?
  138. CtrlDirty       DW      0
  139.  
  140. PtrsHandle      DW      ?
  141. PtrsPID         DW      ?
  142. PtrsFilePos     DD      0016
  143. PtrsDirty       DW      0
  144. PointersStart   DW      0
  145. PointersEnd     DW      NumPtrs-1
  146.  
  147. CharPos         DW      ?
  148. TablePtr        DW      0
  149. FCBTablePtr     DW      0
  150.  
  151. ;
  152. ; table of file handles for skinny files
  153. ;
  154. FileHandleTbl   Label   Word
  155.                 DW      MaxHandles dup(0FFFFh)
  156.  
  157. ;
  158. ; table of Process ID's for the processes that have skinny files
  159. ;
  160. PIDTbl          Label   Word
  161.                 DW      MaxHandles dup(0FFFFh)
  162.  
  163. ;
  164. ; table of current file positions (virtual, not actual) for our files
  165. ;
  166.  
  167. FilePosTbl      Label   DWord
  168.                 DD      MaxHandles dup(0)
  169.  
  170.  
  171. DupeTable       Label   Word
  172.                 DW      MaxHandles*2 dup(0FFFFh)
  173.  
  174. ;
  175. ; a table of remembered file names from FCB's created/opened
  176. ;
  177.  
  178. FCBTable        Label   Byte
  179.                 DB      MaxHandles * 12 dup(" ")
  180.                 DB      0, 0
  181.  
  182. ;
  183. ; some buffers (filenames, etc.)
  184. ;
  185.  
  186. NameBuffer      DB      MaxName+2 Dup(0)
  187. CreateName      DB      MaxName+2 Dup(0)
  188. ScreenSave      DB      160       Dup(0)
  189.  
  190. fbufbytes       DW      0
  191. fbufndx         DW      MaxTextBuf
  192.  
  193. ;
  194. ; some other data
  195. ;
  196.  
  197. AskMessage1     Label   Byte
  198.                 DB      "Should "
  199. AMLen1          =       $-AskMessage1
  200.  
  201. AskMessage2     Label   Byte
  202.                 DB      " be decompressed? (Y/N)    "
  203. AMLen2          =       $-AskMessage2
  204.  
  205. ReadErrorMessage Label  Byte
  206.  DB "           Damaged file (disk data may be lost).  Press ─┘ to continue.     "
  207. LReadError      =       $-ReadErrorMessage
  208.  
  209. WriteErrorMessage Label Byte
  210.  DB " Disk full, or damaged file (disk data may be lost).  Press ─┘ to continue. "
  211. LWriteError     =       $-WriteErrorMessage
  212.  
  213. TooManyError    Label   Byte
  214.  DB " Too many compressed files open at once (limit 10).  Press ─┘ to continue.  "
  215. LTooManyError   =       $-TooManyError
  216.  
  217. FileCount       DW      0
  218. AnswerPos       DW      0
  219. CPosSave        DW      0
  220. CTypSave        DW      0
  221.  
  222. FCBPtr          Label   DWord
  223. FCBOfs          DW      ?
  224. FCBSeg          DW      ?
  225.  
  226. ;
  227. ; ApplBufferPtr stores the DX:DS buffer pointer for certain DOS operations
  228. ;
  229.  
  230. ApplBufferPtr   Label   DWord
  231. CreatePtr       Label   DWord
  232. R_DX            DW      ?               ; register contents at entry to DOS
  233. R_DS            DW      ?
  234. R_CX            DW      ?
  235. R_AL            DB      ?
  236. R_AX            DW      ?
  237. R_SI            DW      ?
  238. R_DI            DW      ?
  239.  
  240. ;
  241. ; some more data
  242. ;
  243.  
  244. DietEOF         DW      ?
  245. CreateLength    DW      ?
  246. DirLength       DW      ?
  247.  
  248. OurDTA          Label   DWord
  249. OurDTAOfs       DW      ?
  250. OurDTASeg       DW      ?
  251. OldDTA          Label   DWord
  252. OldDTAOfs       DW      ?
  253. OldDTASeg       DW      ?
  254.  
  255. EndOfBlock      DW      ?
  256. BytesMoved      DW      ?
  257. RD_ONLY         DB      ?
  258. RD_WR           DB      ?
  259. CompressLength  DW      ?
  260. FirstEmpty      DB      ?
  261.  
  262. NumBlocks       DW      ?
  263. AdvancePtr      DW      ?
  264. TotalLength     DD      ?
  265.  
  266. PointerBlock    DW      0
  267. LinkLength      DW      ?
  268. LinkLocation    DD      ?
  269.  
  270. CurrLen         DW      ?
  271. CurrPtr         DD      ?
  272. LenToWrite      DW      ?
  273. NextPtr         DD      ?
  274. PrevPtr         DD      ?
  275. NextLen         DW      ?
  276. PtrRecSegment   DW      ?
  277. WritePtr        DW      ?
  278.  
  279. GetCtrlHandle   DW      ?
  280. GetCtrlPID      DW      ?
  281. GetPtrsHandle   DW      ?
  282. GetPtrsPID      DW      ?
  283. PutCtrlHandle   DW      ?
  284. PutCtrlPID      DW      ?
  285. PutPtrsHandle   DW      ?
  286. PutPtrsPID      DW      ?
  287.  
  288. CritFlag        DW      0
  289. DOSVersion      DB      ?
  290. DOSVersMin      DB      ?
  291. IOFlag          DW      0
  292.  
  293. Int24Ptr        Label   DWord
  294. Int24Ofs        DW      ?
  295. Int24Seg        DW      ?
  296.  
  297. ;
  298. ; a buffer for reading files to see if they have a footprint
  299. ;
  300.  
  301. FootBuffer      DB      16 dup(?)
  302.  
  303.  
  304. ;
  305. ; a "zero-mask" for the control record
  306. ;
  307.  
  308. Control_ZM      Label   Byte
  309.                 DB      "lZdIeT"        ; footprint (6 bytes)
  310.                 DD      0               ; current file length (virtual)
  311.                 DB      6 dup(0)        ; filler 
  312. Ctrl_ZM_Size    =       $-Control_ZM
  313.  
  314. ;
  315. ; I/O and de-compression buffers
  316. ;
  317.  
  318.                 Even
  319. CtrlBuffer      Label   Byte
  320.   CtrlFootPrint DB      6 dup(?)
  321.   Ctrl_FileLen  DD      ?       
  322.                 DB      6 dup(?) 
  323. CtrlSize        =       $-CtrlBuffer
  324.  
  325.                 Even
  326. Ctrl_Pointers   Label   Byte
  327.   Ctrl_Next     DD      ?
  328.   Ctrl_Prev     DD      ?
  329.                 DB      8 dup(?) 
  330.   Loc_Len_Info  DB      NumPtrs*6 dup(?)
  331. PtrsSize        =       $-Ctrl_Pointers
  332.  
  333.   EndOfCtrlRec  Label   Byte
  334.  
  335.  
  336.                 Even
  337. DeCompBuffer    Label   Byte
  338.   ILinkPtr      DD      ?
  339.   ILinkLen      DW      ?
  340.                 DB      MaxBuf+512  dup(?)
  341.  
  342.                 Even
  343. IOBuffer        Label   Byte
  344.   OLinkPtr      DD      ?
  345.   OLinkLen      DW      ?
  346.                 DB      MaxBuf+512  dup(?)
  347.  
  348.  
  349. ;
  350. ;Hash table
  351. ;
  352.  
  353.                 Even
  354. Hash            Label   Byte
  355.  
  356. Next            DW      ?               ; Next entry along chain
  357.                 DW      maxmax dup(?)
  358.  
  359. Char            DB      ?               ; Suffix char
  360.                 DB      maxmax dup(?)
  361.  
  362. First           DW      ?               ; First entry with this value
  363.                 DW      maxmax dup(?)
  364.  
  365.  
  366. ;
  367. ; other compression-related items
  368. ;
  369.  
  370. Prefix_Code     DW      ?
  371. Free_Code       DW      ?
  372. Max_Code        DW      ?
  373. NBits           DW      ?
  374. K               DB      ?
  375. Bit_Offset      DW      ?
  376. Input_Offset    DW      0
  377. Input_Size      DW      0
  378. Cur_Code        DW      ?
  379. Old_Code        DW      ?
  380. In_Code         DW      ?
  381. Stack_Count     DW      0
  382. Fin_Char        DB      ?
  383. Masks           DW      1ffh, 3ffh, 7ffh, 0fffh
  384. Output_Offset   DW      0
  385.  
  386.  
  387. ;-----------------------------------------------------------------;
  388. ;       INT 21 interception                                       ;
  389. ;-----------------------------------------------------------------;
  390. DOS_Handler     Proc    Far
  391.  
  392. ISR_21:
  393.                 PushF
  394.                 STI
  395.  
  396.                 Mov     CS:IOFlag, 0
  397.  
  398. CaseFunc00:
  399.                 Cmp     AH, Term00Op
  400.                 JNE     CaseFunc31
  401.                 Jmp     DoTerm
  402. CaseFunc31:
  403.                 Cmp     AH, Term31Op
  404.                 JNE     CaseFunc4C
  405.                 Jmp     DoTerm
  406. CaseFunc4C:
  407.                 Cmp     AH, Term4COp
  408.                 JNE     CaseCreate
  409.                 Jmp     DoTerm
  410. CaseCreate:
  411.                 Cmp     AH, CreateOp
  412.                 JNE     CaseOpen
  413.                 Jmp     DoCreate
  414. CaseOpen:
  415.                 Cmp     AH, OpenOp
  416.                 JNE     CaseClose
  417.                 Jmp     DoOpen
  418. CaseClose:
  419.                 Cmp     AH, CloseOp
  420.                 JNE     CaseRead
  421.                 Jmp     DoClose
  422. CaseRead:
  423.                 Cmp     AH, ReadOp
  424.                 JNE     CaseWrite
  425.                 Jmp     DoRead
  426. CaseWrite:
  427.                 Cmp     AH, WriteOp
  428.                 JNE     CaseSeek
  429.                 Jmp     DoWrite
  430. CaseSeek:
  431.                 Cmp     AH, SeekOp
  432.                 JNE     CaseDupe
  433.                 Jmp     DoSeek
  434. CaseDupe:
  435.                 Cmp     AH, DupeHandOp
  436.                 JNE     CaseForceDupe
  437.                 Jmp     DoDupe
  438. CaseForceDupe:
  439.                 Cmp     AH, ForceDupeOp
  440.                 JNE     CaseLock
  441.                 Jmp     DoForceDupe
  442. CaseLock:
  443.                 Cmp     AH, LockOp
  444.                 JNE     CaseCreateNew
  445.                 Jmp     DoLockUnlock
  446. CaseCreateNew:
  447.                 Cmp     AH, CreateNewOp
  448.                 JNE     CaseFCBOpen
  449.                 Jmp     DoCreateNew
  450. CaseFCBOpen:
  451.                 Cmp     AH, FCBOpenOp
  452.                 JNE     CaseFCBClose
  453.                 Jmp     DoFCBOpen
  454. CaseFCBClose:
  455.                 Cmp     AH, FCBCloseOp
  456.                 JNE     CaseFCBSeqRead
  457.                 Jmp     DoFCBClose
  458. CaseFCBSeqRead:
  459.                 Cmp     AH, FCBSeqReadOp
  460.                 JNE     CaseFCBSeqWrite
  461.                 Jmp     DoFCBSeqRead
  462. CaseFCBSeqWrite:
  463.                 Cmp     AH, FCBSeqWriteOp
  464.                 JNE     CaseFCBCreate
  465.                 Jmp     DoFCBSeqWrite
  466. CaseFCBCreate:
  467.                 Cmp     AH, FCBCreateOp
  468.                 JNE     CaseFCBRandRead
  469.                 Jmp     DoFCBCreate
  470. CaseFCBRandRead:
  471.                 Cmp     AH, FCBRandReadOp
  472.                 JNE     CaseFCBRandWrite
  473.                 Jmp     DoFCBRandRead
  474. CaseFCBRandWrite:
  475.                 Cmp     AH, FCBRandWriteOp
  476.                 JNE     CaseFCBFileSize
  477.                 Jmp     DoFCBRandWrite
  478. CaseFCBFileSize:
  479.                 Cmp     AH, FCBFileSizeOp
  480.                 JNE     CaseFCBBlockRead
  481.                 Jmp     DoFCBFileSize
  482. CaseFCBBlockRead:
  483.                 Cmp     AH, FCBBlockReadOp
  484.                 JNE     CaseFCBBlockWrite
  485.                 Jmp     DoFCBBlockRead
  486. CaseFCBBlockWrite:
  487.                 Cmp     AH, FCBBlockWriteOp
  488.                 JNE     CaseCtlBrkCheck
  489.                 Jmp     DoFCBBlockWrite
  490. CaseCtlBrkCheck:
  491.                 Cmp     AX, 3341h
  492.                 JNE     DefaultDOS
  493.                 Jmp     DoInstalledResponse
  494.  
  495. DefaultDOS:
  496.                 PopF
  497.                 Jmp     CS:OldInt21     ; let DOS handle it normally
  498.  
  499.  
  500. ;-----------------------------------------------------------------;
  501. ;       AX=3341h, Int 21h asks if we are loaded.  Answer yes.     ;
  502. ;-----------------------------------------------------------------;
  503.  
  504. DoInstalledResponse:
  505.                 Mov     DX, 1234h
  506.                 Mov     CX, CS
  507.                 Mov     CS:IOFlag, 0
  508.                 Jmp     ExitDOS
  509.  
  510.  
  511.  
  512. ;-----------------------------------------------------------------;
  513. ;       Handle Program Terminate Functions                        ;
  514. ;-----------------------------------------------------------------;
  515. DoTerm:
  516.                 Push    AX              ; save registers
  517.                 Push    BX
  518.                 Push    CX
  519.                 Push    DX
  520.                 Push    SI
  521.                 Push    DI
  522.                 Push    BP
  523.                 Push    ES
  524.                 Push    DS
  525.  
  526.                 Mov     CS:OldSP, SP
  527.                 Mov     CS:OldSS, SS
  528.  
  529.                 CLI                     ; use our stack
  530.                 Mov     SS, CS:OurSS
  531.                 Mov     SP, CS:OurSP
  532.                 STI
  533.  
  534.                 Push    CS              ; addressability to this segment
  535.                 Pop     DS
  536.                 Push    DS
  537.                 Pop     ES
  538.                 CLD
  539.  
  540.                 Call    CloseRemaining
  541.  
  542.                 CLI                     ; restore user's stack
  543.                 Mov     SS, CS:OldSS
  544.                 Mov     SP, CS:OldSP
  545.                 STI
  546.  
  547.                 Pop     DS
  548.                 Pop     ES
  549.                 Pop     BP
  550.                 Pop     DI
  551.                 Pop     SI
  552.                 Pop     DX
  553.                 Pop     CX
  554.                 Pop     BX
  555.                 Pop     AX
  556.  
  557.                 Jmp     DefaultDOS
  558.  
  559.  
  560.  
  561.  
  562. ;-----------------------------------------------------------------;
  563. ;       Handle Create-File Function Call                          ;
  564. ;-----------------------------------------------------------------;
  565.  
  566.  
  567. DoCreate:
  568.                 CallDOS CreateOp
  569.                 JNC     DoCreate_1
  570.                 Jmp     BadDOS          ; if not created, don't process
  571.  
  572. DoCreate_1:
  573.                 Push    AX              ; save registers
  574.                 Push    BX
  575.                 Push    CX
  576.                 Push    DX
  577.                 Push    SI
  578.                 Push    DI
  579.                 Push    BP
  580.                 Push    ES
  581.                 Push    DS
  582.  
  583.                 Mov     CS:OldSP, SP
  584.                 Mov     CS:OldSS, SS
  585.  
  586.                 CLI                     ; use our stack
  587.                 Mov     SS, CS:OurSS
  588.                 Mov     SP, CS:OurSP
  589.                 STI
  590.  
  591.                 Mov     CS:R_DS, DS     ; save ptr to AsciiZ name
  592.                 Mov     CS:R_DX, DX
  593.  
  594.                 Push    CS              ; addressability to this segment
  595.                 Pop     DS
  596.                 Push    DS
  597.                 Pop     ES
  598.                 CLD
  599.  
  600.                 Mov     CurrHandle, AX
  601.  
  602.                 Call    GetOldPID
  603.                 Call    SearchTable
  604.                 JC      DoCreate_5
  605.                 Call    ForgetThisFile
  606.  
  607. DoCreate_5:
  608.                 Call    SearchDietDir   ; look in the Diet.Dir file
  609.                 JC      DoCreate_9      ; if not in Diet.Dir
  610.  
  611.                 Call    WriteInitControl ; initialize skinny file
  612.                 Call    RememberThisFile
  613.  
  614. DoCreate_9:
  615.                 CLI                     ; restore user's stack
  616.                 Mov     SS, CS:OldSS
  617.                 Mov     SP, CS:OldSP
  618.                 STI
  619.  
  620.                 Pop     DS
  621.                 Pop     ES
  622.                 Pop     BP
  623.                 Pop     DI
  624.                 Pop     SI
  625.                 Pop     DX
  626.                 Pop     CX
  627.                 Pop     BX
  628.                 Pop     AX
  629.  
  630.                 Jmp     ExitDOS
  631.  
  632.  
  633. ;-----------------------------------------------------------------;
  634. ;       Handle Open-File Function Call                            ;
  635. ;-----------------------------------------------------------------;
  636.  
  637. DoOpen:
  638.                 CallDOS OpenOp
  639.                 JNC     DoOpen_1
  640.                 Jmp     BadDOS          ; if bad open, we can't do anything
  641.  
  642. DoOpen_1:
  643.                 Push    AX              ; save registers
  644.                 Push    BX
  645.                 Push    CX
  646.                 Push    DX
  647.                 Push    SI
  648.                 Push    DI
  649.                 Push    BP
  650.                 Push    ES
  651.                 Push    DS
  652.  
  653.                 Mov     CS:OldSP, SP
  654.                 Mov     CS:OldSS, SS
  655.  
  656.                 CLI                     ; use our stack
  657.                 Mov     SS, CS:OurSS
  658.                 Mov     SP, CS:OurSP
  659.                 STI
  660.  
  661.                 Mov     CS:R_DS, DS     ; save ptr to AsciiZ name
  662.                 Mov     CS:R_DX, DX
  663.  
  664.                 Push    CS              ; addressability to this segment
  665.                 Pop     DS
  666.                 Push    DS
  667.                 Pop     ES
  668.                 CLD
  669.  
  670.                 Mov     CurrHandle, AX
  671.                 Call    GetOldPID       ; which process is opening a file?
  672.  
  673.                 Call    SearchTable
  674.                 JC      DoOpen_5
  675.  
  676.                 Call    ForgetThisFile
  677.  
  678. DoOpen_5:
  679.                 Cmp     AskFlag, 2
  680.                 JNE     DoOpen_5A
  681.                 Jmp     DoOpen_9
  682.  
  683. DoOpen_5A:      Call    ReadFootPrint
  684.                 JNC     DoOpen_5B
  685.                 Jmp     DoOpen_9
  686.  
  687. DoOpen_5B:      Cmp     AskFlag, 1
  688.                 JNE     DoOpen_7
  689.  
  690.                 Call    SaveLine25
  691.                 JC      DoOpen_7
  692.  
  693.                 Mov     DX, 1800h
  694.                 Mov     AnswerPos, 0
  695.                 Mov     DI, Offset AskMessage1
  696.                 Mov     CX, AMLen1
  697.                 Add     AnswerPos, CX
  698.                 Call    AttrCharOut
  699.  
  700.                 Push    DX
  701.                 Call    Parse_DS_DX_Name
  702.                 Pop     DX
  703.  
  704.                 Mov     DI, Offset CreateName
  705.                 Mov     CX, CreateLength
  706.                 Add     AnswerPos, CX
  707.                 Call    AttrCharOut
  708.                 Mov     DI, Offset AskMessage2
  709.                 Mov     CX, AMLen2
  710.                 Add     AnswerPos, CX
  711.                 Call    AttrCharOut
  712.  
  713. GetAnswer:      
  714.                 Mov     AH, 2
  715.                 Mov     BH, 0
  716.                 Mov     DX, 1800h
  717.                 Add     DX, AnswerPos
  718.                 Dec     DX
  719.                 Dec     DX
  720.                 Int     10h
  721.  
  722.                 Mov     AH, 0
  723.                 Int     16h
  724.                 Cmp     AL, 'Y'
  725.                 JE      AnswerIsYes
  726.                 Cmp     AL, 'y'
  727.                 JE      AnswerIsYes
  728.                 Cmp     AL, 'N'
  729.                 JE      AnswerIsNo
  730.                 Cmp     AL, 'n'
  731.                 JE      AnswerIsNo
  732.                 Jmp     GetAnswer
  733.  
  734. AnswerIsNo:
  735.                 Call    RestLine25
  736.                 Jmp     DoOpen_9
  737.  
  738. AnswerIsYes:
  739.                 Call    RestLine25
  740. DoOpen_7:
  741.                 Call    RememberThisFile ; save file handle, etc. in table
  742.  
  743.                 Mov     AX, CurrHandle
  744.                 Mov     GetCtrlHandle, AX
  745.                 Mov     GetPtrsHandle, AX
  746.                 Mov     AX, OldPID
  747.                 Mov     GetCtrlPID, AX
  748.                 Mov     GetPtrsPID, AX
  749.                 Call    GetControlRec
  750.                 Mov     PointerBlock, 0
  751.                 Call    GetPointerRec
  752.  
  753. DoOpen_9:
  754.                 CLI                     ; restore user's stack
  755.                 Mov     SS, CS:OldSS
  756.                 Mov     SP, CS:OldSP
  757.                 STI
  758.  
  759.                 Pop     DS              ; back to the application
  760.                 Pop     ES
  761.                 Pop     BP
  762.                 Pop     DI
  763.                 Pop     SI
  764.                 Pop     DX
  765.                 Pop     CX
  766.                 Pop     BX
  767.                 Pop     AX
  768.  
  769.                 Jmp     ExitDOS
  770.  
  771.  
  772. ;-----------------------------------------------------------------;
  773. ;       Handle Close-File Function Call                           ;
  774. ;-----------------------------------------------------------------;
  775.  
  776. DoClose:
  777.                 Push    AX              ; save registers
  778.                 Push    BX
  779.                 Push    CX
  780.                 Push    DX
  781.                 Push    SI
  782.                 Push    DI
  783.                 Push    BP
  784.                 Push    ES
  785.                 Push    DS
  786.  
  787.                 Mov     CS:OldSP, SP
  788.                 Mov     CS:OldSS, SS
  789.  
  790.                 CLI                     ; use our stack
  791.                 Mov     SS, CS:OurSS
  792.                 Mov     SP, CS:OurSP
  793.                 STI
  794.  
  795.                 Push    CS              ; addressability to this segment
  796.                 Pop     DS
  797.                 Push    DS
  798.                 Pop     ES
  799.                 CLD
  800.  
  801.                 Mov     CurrHandle, BX
  802.                 Call    GetOldPID       ; process that's closing a file
  803.                 Call    SearchTable     ; is it one of ours?
  804.                 JC      DoClose_9       ; no
  805.  
  806.                 Mov     BX, CurrHandle
  807.                 Cmp     BX, DeCompHandle
  808.                 JNE     DoClose_8
  809.  
  810.                 Mov     AL, 0
  811.                 CallDOS FDateTimeOp
  812.                 Push    CX
  813.                 Push    DX
  814.                 Call    PutBlock
  815.                 Call    WritePointerRec
  816.                 Call    WriteTheCtrlRec
  817.                 Pop     DX
  818.                 Pop     CX
  819.                 Mov     BX, CurrHandle
  820.                 Mov     AL, 1
  821.                 CallDOS FDateTimeOp
  822.  
  823. DoClose_8:      
  824.                 Call    ForgetThisFile
  825.  
  826. DoClose_9:
  827.                 CLI                     ; restore user's stack
  828.                 Mov     SS, CS:OldSS
  829.                 Mov     SP, CS:OldSP
  830.                 STI
  831.  
  832.                 Pop     DS              ; back to the application
  833.                 Pop     ES
  834.                 Pop     BP
  835.                 Pop     DI
  836.                 Pop     SI
  837.                 Pop     DX
  838.                 Pop     CX
  839.                 Pop     BX
  840.                 Pop     AX
  841.  
  842.                 Jmp     DefaultDOS
  843.  
  844.  
  845. ;-----------------------------------------------------------------;
  846. ;       Handle Read-File Function Call                            ;
  847. ;-----------------------------------------------------------------;
  848.  
  849. DoRead:
  850.                 Push    AX              ; save registers
  851.                 Push    BX
  852.                 Push    CX
  853.                 Push    DX
  854.                 Push    SI
  855.                 Push    DI
  856.                 Push    BP
  857.                 Push    ES
  858.                 Push    DS
  859.  
  860.                 Mov     CS:R_DS, DS
  861.                 Mov     CS:R_DX, DX
  862.                 Mov     CS:R_CX, CX
  863.  
  864.                 Mov     CS:OldSP, SP
  865.                 Mov     CS:OldSS, SS
  866.  
  867.                 CLI                     ; use our stack
  868.                 Mov     SS, CS:OurSS
  869.                 Mov     SP, CS:OurSP
  870.                 STI
  871.  
  872.                 Push    CS              ; addressability to this segment
  873.                 Pop     DS
  874.                 Push    DS
  875.                 Pop     ES
  876.                 CLD
  877.  
  878. ;
  879. ; Find out who's calling us, and for what file.
  880. ; Is it one of our skinny files?
  881. ;
  882.                 Mov     CurrHandle, BX
  883.                 Call    GetOldPID
  884.                 Call    SearchTable
  885.                 JNC     DoRead_1        ; it's a skinny file
  886.  
  887.                 Jmp     DoRead_9        ; not one of ours (let DOS do it)
  888.  
  889. DoRead_1:
  890.                 Call    Get_CX_Bytes_To_DSDX
  891.                 Call    AlignDupedFiles
  892.  
  893. DoRead_8:
  894.                 CLI                     ; restore user's stack
  895.                 Mov     SS, CS:OldSS
  896.                 Mov     SP, CS:OldSP
  897.                 STI
  898.  
  899.                 Pop     DS              ; read request satisfied....
  900.                 Pop     ES              ; go back to the application
  901.                 Pop     BP
  902.                 Pop     DI
  903.                 Pop     SI
  904.                 Pop     DX
  905.                 Pop     CX
  906.                 Pop     BX
  907.                 Pop     AX
  908.  
  909.                 Mov     AX, CS:BytesMoved
  910.                 Jmp     ExitDOS
  911.  
  912.  
  913. ;
  914. ; file is not skinny....let DOS handle it.
  915. ;
  916.  
  917. DoRead_9:
  918.                 CLI                     ; restore user's stack
  919.                 Mov     SS, CS:OldSS
  920.                 Mov     SP, CS:OldSP
  921.                 STI
  922.  
  923.                 Pop     DS
  924.                 Pop     ES
  925.                 Pop     BP
  926.                 Pop     DI
  927.                 Pop     SI
  928.                 Pop     DX
  929.                 Pop     CX
  930.                 Pop     BX
  931.                 Pop     AX
  932.  
  933.                 Jmp     DefaultDOS
  934.  
  935.  
  936. ;-----------------------------------------------------------------;
  937. ;       Handle Write-File Function Call                           ;
  938. ;-----------------------------------------------------------------;
  939.  
  940. DoWrite:
  941.                 Push    AX              ; save registers
  942.                 Push    BX
  943.                 Push    CX
  944.                 Push    DX
  945.                 Push    SI
  946.                 Push    DI
  947.                 Push    BP
  948.                 Push    ES
  949.                 Push    DS
  950.  
  951.                 Mov     CS:R_DS, DS
  952.                 Mov     CS:R_DX, DX
  953.                 Mov     CS:R_CX, CX
  954.  
  955.                 Mov     CS:OldSP, SP
  956.                 Mov     CS:OldSS, SS
  957.  
  958.                 CLI                     ; use our stack
  959.                 Mov     SS, CS:OurSS
  960.                 Mov     SP, CS:OurSP
  961.                 STI
  962.  
  963.                 Push    CS              ; addressability to this segment
  964.                 Pop     DS
  965.                 Push    DS
  966.                 Pop     ES
  967.                 CLD
  968.  
  969.  
  970. ;
  971. ; Find out who's calling us, and for what file.
  972. ; Is it one of our skinny files?
  973. ;
  974.                 Mov     CurrHandle, BX
  975.                 Call    GetOldPID
  976.                 Call    SearchTable
  977.                 JNC     DoWrite_1       ; it's a skinny file
  978.  
  979.                 Jmp     DoWrite_9       ; not one of ours (let DOS do it)
  980.  
  981. DoWrite_1:
  982.                 Call    Put_CX_Bytes_From_DSDX
  983.  
  984.                 CLI                     ; restore user's stack
  985.                 Mov     SS, CS:OldSS
  986.                 Mov     SP, CS:OldSP
  987.                 STI
  988.  
  989.                 Pop     DS              ; write request satisfied....
  990.                 Pop     ES              ; go back to the application
  991.                 Pop     BP
  992.                 Pop     DI
  993.                 Pop     SI
  994.                 Pop     DX
  995.                 Pop     CX
  996.                 Pop     BX
  997.                 Pop     AX
  998.  
  999.                 Mov     AX, CS:BytesMoved
  1000.                 Jmp     ExitDOS
  1001.  
  1002.  
  1003. ;
  1004. ; file is not skinny....let DOS handle it.
  1005. ;
  1006.  
  1007. DoWrite_9:
  1008.                 CLI                     ; restore user's stack
  1009.                 Mov     SS, CS:OldSS
  1010.                 Mov     SP, CS:OldSP
  1011.                 STI
  1012.  
  1013.                 Pop     DS
  1014.                 Pop     ES
  1015.                 Pop     BP
  1016.                 Pop     DI
  1017.                 Pop     SI
  1018.                 Pop     DX
  1019.                 Pop     CX
  1020.                 Pop     BX
  1021.                 Pop     AX
  1022.  
  1023.                 Jmp     DefaultDOS
  1024.  
  1025. ;-----------------------------------------------------------------;
  1026. ;       Handle Seek-File Function Call                            ;
  1027. ;-----------------------------------------------------------------;
  1028.  
  1029. DoSeek:
  1030.                 Push    AX              ; save registers
  1031.                 Push    BX
  1032.                 Push    CX
  1033.                 Push    DX
  1034.                 Push    SI
  1035.                 Push    DI
  1036.                 Push    BP
  1037.                 Push    ES
  1038.                 Push    DS
  1039.  
  1040.                 Mov     CS:R_DX, DX
  1041.                 Mov     CS:R_CX, CX
  1042.                 Mov     CS:R_AL, AL
  1043.  
  1044.                 Mov     CS:OldSP, SP
  1045.                 Mov     CS:OldSS, SS
  1046.  
  1047.                 CLI                     ; use our stack
  1048.                 Mov     SS, CS:OurSS
  1049.                 Mov     SP, CS:OurSP
  1050.                 STI
  1051.  
  1052.                 Push    CS              ; addressability to this segment
  1053.                 Pop     DS
  1054.                 Push    DS
  1055.                 Pop     ES
  1056.                 CLD
  1057.  
  1058.  
  1059. ;
  1060. ; Find out who's calling us, and for what file.
  1061. ; Is it one of our skinny files?
  1062. ;
  1063.  
  1064.                 Mov     CurrHandle, BX
  1065.                 Call    GetOldPID
  1066.                 Call    SearchTable
  1067.                 JNC     DoSeek_0        ; it's a skinny file
  1068.  
  1069.                 Jmp     DoSeek_9        ; not one of ours (let DOS do it)
  1070.  
  1071. DoSeek_0:
  1072.                 Mov     BX, TablePtr
  1073.                 Shl     BX, 1
  1074.                 Mov     CX, R_CX
  1075.                 Mov     DX, R_DX
  1076.  
  1077.                 Cmp     R_AL, 0
  1078.                 JNE     DoSeek_1
  1079.  
  1080. ;
  1081. ; seek from *beginning* of file
  1082. ;
  1083.                 Mov     Word Ptr FilePosTbl [BX], DX
  1084.                 Mov     Word Ptr FilePosTbl [BX+2], CX
  1085.  
  1086.                 Jmp     DoSeek_8
  1087.  
  1088. DoSeek_1:
  1089.                 Cmp     R_AL, 1
  1090.                 JNE     DoSeek_2
  1091.  
  1092. ;
  1093. ; seek from *current* position
  1094. ;
  1095.                 Add     DX, Word Ptr FilePosTbl [BX]
  1096.                 Adc     CX, Word Ptr FilePosTbl [BX+2]
  1097.                 Mov     Word Ptr FilePosTbl [BX], DX
  1098.                 Mov     Word Ptr FilePosTbl [BX+2], CX
  1099.  
  1100.                 Jmp     DoSeek_8
  1101.  
  1102.  
  1103. DoSeek_2:
  1104. ;
  1105. ; seek from *end* of file
  1106. ;
  1107.                 Mov     AX, CurrHandle
  1108.                 Mov     GetCtrlHandle, AX
  1109.                 Mov     AX, OldPID
  1110.                 Mov     GetCtrlPID, AX
  1111.                 Call    GetControlRec
  1112.  
  1113.                 Add     DX, Word Ptr Ctrl_FileLen
  1114.                 Adc     CX, Word Ptr Ctrl_FileLen+2
  1115.                 Mov     Word Ptr FilePosTbl [BX], DX
  1116.                 Mov     Word Ptr FilePosTbl [BX+2], CX
  1117.  
  1118. DoSeek_8:       
  1119.                 Mov     R_CX, CX
  1120.                 Mov     R_DX, DX
  1121.  
  1122.                 Call    AlignDupedFiles
  1123.  
  1124.                 CLI                     ; restore user's stack
  1125.                 Mov     SS, CS:OldSS
  1126.                 Mov     SP, CS:OldSP
  1127.                 STI
  1128.  
  1129.                 Pop     DS              ; seek request satisfied....
  1130.                 Pop     ES              ; go back to the application
  1131.                 Pop     BP
  1132.                 Pop     DI
  1133.                 Pop     SI
  1134.                 Pop     DX
  1135.                 Pop     CX
  1136.                 Pop     BX
  1137.                 Pop     AX
  1138.  
  1139.                 Mov     DX, Word Ptr CS:R_CX
  1140.                 Mov     AX, Word Ptr CS:R_DX
  1141.  
  1142.                 Jmp     ExitDOS
  1143.  
  1144.  
  1145. ;
  1146. ; file is not skinny....let DOS handle it.
  1147. ;
  1148.  
  1149. DoSeek_9:
  1150.                 CLI                     ; restore user's stack
  1151.                 Mov     SS, CS:OldSS
  1152.                 Mov     SP, CS:OldSP
  1153.                 STI
  1154.  
  1155.                 Pop     DS
  1156.                 Pop     ES
  1157.                 Pop     BP
  1158.                 Pop     DI
  1159.                 Pop     SI
  1160.                 Pop     DX
  1161.                 Pop     CX
  1162.                 Pop     BX
  1163.                 Pop     AX
  1164.  
  1165.                 Jmp     DefaultDOS
  1166.  
  1167.  
  1168.  
  1169. ;-----------------------------------------------------------------;
  1170. ;       Handle Dupe-Handle Function Call                          ;
  1171. ;-----------------------------------------------------------------;
  1172.  
  1173. DoDupe:         CallDOS DupeHandOp
  1174.                 JNC     DoDupe_0
  1175.                 Jmp     BadDOS
  1176.  
  1177. DoDupe_0:
  1178.                 Push    AX              ; save registers
  1179.                 Push    BX
  1180.                 Push    CX
  1181.                 Push    DX
  1182.                 Push    SI
  1183.                 Push    DI
  1184.                 Push    BP
  1185.                 Push    ES
  1186.                 Push    DS
  1187.  
  1188.  
  1189.                 Mov     CS:OldSP, SP
  1190.                 Mov     CS:OldSS, SS
  1191.  
  1192.                 CLI                     ; use our stack
  1193.                 Mov     SS, CS:OurSS
  1194.                 Mov     SP, CS:OurSP
  1195.                 STI
  1196.  
  1197.                 Mov     CS:R_AX, AX
  1198.  
  1199.                 Push    CS              ; addressability to this segment
  1200.                 Pop     DS
  1201.                 Push    DS
  1202.                 Pop     ES
  1203.                 CLD
  1204.  
  1205.  
  1206. ;
  1207. ; Find out who's calling us, and for what file.
  1208. ; Is it one of our skinny files?
  1209.  
  1210.                 Mov     CurrHandle, BX
  1211.                 Call    GetOldPID
  1212.                 Call    SearchTable
  1213.                 JNC     DoDupe_1        ; it's a skinny file
  1214.  
  1215.                 Jmp     DoDupe_8        ; not one of ours (let DOS do it)
  1216.  
  1217. DoDupe_1:
  1218.                 Push    TablePtr
  1219.                 Mov     AX, R_AX
  1220.                 Mov     CurrHandle, AX
  1221.                 Call    RememberThisFile
  1222.  
  1223.                 Call    SearchTable
  1224.  
  1225.                 Mov     DI, TablePtr
  1226.                 Pop     TablePtr
  1227.                 Mov     SI, TablePtr
  1228.                 Mov     DupeTable [DI], SI
  1229.                 Mov     DupeTable [SI], DI
  1230.  
  1231.                 Call    AlignDupedFiles
  1232.  
  1233. DoDupe_8:
  1234.                 CLI                     ; restore user's stack
  1235.                 Mov     SS, CS:OldSS
  1236.                 Mov     SP, CS:OldSP
  1237.                 STI
  1238.  
  1239.                 Pop     DS              ; request satisfied....
  1240.                 Pop     ES              ; go back to the application
  1241.                 Pop     BP
  1242.                 Pop     DI
  1243.                 Pop     SI
  1244.                 Pop     DX
  1245.                 Pop     CX
  1246.                 Pop     BX
  1247.                 Pop     AX
  1248.  
  1249.                 Jmp     ExitDOS
  1250.  
  1251.  
  1252.  
  1253. ;-----------------------------------------------------------------;
  1254. ;       Handle Force-Dupe-Handle Function Call                    ;
  1255. ;-----------------------------------------------------------------;
  1256.  
  1257. DoForceDupe:    CallDOS ForceDupeOp
  1258.                 JNC     DoForce_0
  1259.                 Jmp     BadDOS
  1260.  
  1261. DoForce_0:
  1262.                 Push    AX              ; save registers
  1263.                 Push    BX
  1264.                 Push    CX
  1265.                 Push    DX
  1266.                 Push    SI
  1267.                 Push    DI
  1268.                 Push    BP
  1269.                 Push    ES
  1270.                 Push    DS
  1271.  
  1272.  
  1273.                 Mov     CS:OldSP, SP
  1274.                 Mov     CS:OldSS, SS
  1275.  
  1276.                 CLI                     ; use our stack
  1277.                 Mov     SS, CS:OurSS
  1278.                 Mov     SP, CS:OurSP
  1279.                 STI
  1280.  
  1281.                 Mov     CS:R_CX, CX
  1282.  
  1283.                 Push    CS              ; addressability to this segment
  1284.                 Pop     DS
  1285.                 Push    DS
  1286.                 Pop     ES
  1287.                 CLD
  1288.  
  1289.  
  1290. ;
  1291. ; Find out who's calling us, and for what file.
  1292. ; Is it one of our skinny files?
  1293.  
  1294.                 Mov     CurrHandle, BX
  1295.                 Call    GetOldPID
  1296.                 Call    SearchTable
  1297.                 JNC     DoForce_1       ; it's a skinny file
  1298.  
  1299.                 Jmp     DoForce_8       ; not one of ours (let DOS do it)
  1300.  
  1301. DoForce_1:
  1302.                 Push    TablePtr
  1303.                 Mov     CX, R_CX
  1304.                 Mov     CurrHandle, CX
  1305.                 Call    RememberThisFile
  1306.  
  1307.                 Mov     DI, TablePtr
  1308.                 Pop     TablePtr
  1309.                 Mov     SI, TablePtr
  1310.                 Mov     DupeTable [DI], SI
  1311.                 Mov     DupeTable [SI], DI
  1312.  
  1313.                 Call    AlignDupedFiles
  1314.  
  1315. DoForce_8:
  1316.                 CLI                     ; restore user's stack
  1317.                 Mov     SS, CS:OldSS
  1318.                 Mov     SP, CS:OldSP
  1319.                 STI
  1320.  
  1321.                 Pop     DS              ; request satisfied....
  1322.                 Pop     ES              ; go back to the application
  1323.                 Pop     BP
  1324.                 Pop     DI
  1325.                 Pop     SI
  1326.                 Pop     DX
  1327.                 Pop     CX
  1328.                 Pop     BX
  1329.                 Pop     AX
  1330.  
  1331.                 Jmp     ExitDOS
  1332.  
  1333.  
  1334.  
  1335.  
  1336. ;-----------------------------------------------------------------;
  1337. ;       Handle Lock/Unlock Function Call                          ;
  1338. ;-----------------------------------------------------------------;
  1339.  
  1340. DoLockUnlock:
  1341.                 Push    AX              ; save registers
  1342.                 Push    BX
  1343.                 Push    CX
  1344.                 Push    DX
  1345.                 Push    SI
  1346.                 Push    DI
  1347.                 Push    BP
  1348.                 Push    ES
  1349.                 Push    DS
  1350.  
  1351.  
  1352.                 Mov     CS:OldSP, SP
  1353.                 Mov     CS:OldSS, SS
  1354.  
  1355.                 CLI                     ; use our stack
  1356.                 Mov     SS, CS:OurSS
  1357.                 Mov     SP, CS:OurSP
  1358.                 STI
  1359.  
  1360.                 Mov     CS:R_AL, AL
  1361.                 Mov     CS:R_CX, CX
  1362.                 Mov     CS:R_DX, DX
  1363.                 Mov     CS:R_SI, SI
  1364.                 Mov     CS:R_DI, DI
  1365.  
  1366.                 Push    CS              ; addressability to this segment
  1367.                 Pop     DS
  1368.                 Push    DS
  1369.                 Pop     ES
  1370.                 CLD
  1371.  
  1372.  
  1373. ;
  1374. ; Find out who's calling us, and for what file.
  1375. ; Is it one of our skinny files?
  1376.  
  1377.                 Mov     CurrHandle, BX
  1378.                 Call    GetOldPID
  1379.                 Call    SearchTable
  1380.                 JNC     DoLock_0        ; it's a skinny file
  1381.  
  1382.                 Jmp     DoLock_9        ; not one of ours (let DOS do it)
  1383.  
  1384. DoLock_0:
  1385.                 Mov     BX, CurrHandle
  1386.                 Mov     CX, 0
  1387.                 Mov     DX, CX
  1388.                 Mov     SI, 0FFFFh
  1389.                 Mov     DI, SI
  1390.                 Mov     AL, R_AL
  1391.                 CallDOS LockOp
  1392.                 JNC     LockOk
  1393.  
  1394.                 Mov     R_AX, AX
  1395.                 CLI
  1396.                 Mov     SS, CS:OldSS
  1397.                 Mov     SP, CS:OldSP
  1398.                 STI
  1399.  
  1400.                 Pop     DS
  1401.                 Pop     ES
  1402.                 Pop     BP
  1403.                 Pop     DI
  1404.                 Pop     SI
  1405.                 Pop     DX
  1406.                 Pop     CX
  1407.                 Pop     BX
  1408.                 Pop     AX
  1409.                 Mov     AX, CS:R_AX
  1410.  
  1411.                 Jmp     BadDOS
  1412.  
  1413.  
  1414. LockOk:         CLI                     ; restore user's stack
  1415.                 Mov     SS, CS:OldSS
  1416.                 Mov     SP, CS:OldSP
  1417.                 STI
  1418.  
  1419.                 Pop     DS              ; request satisfied....
  1420.                 Pop     ES              ; go back to the application
  1421.                 Pop     BP
  1422.                 Pop     DI
  1423.                 Pop     SI
  1424.                 Pop     DX
  1425.                 Pop     CX
  1426.                 Pop     BX
  1427.                 Pop     AX
  1428.  
  1429.                 Jmp     ExitDOS
  1430.  
  1431.  
  1432.  
  1433. DoLock_9:
  1434.                 CLI                     ; restore user's stack
  1435.                 Mov     SS, CS:OldSS
  1436.                 Mov     SP, CS:OldSP
  1437.                 STI
  1438.  
  1439.                 Pop     DS
  1440.                 Pop     ES
  1441.                 Pop     BP
  1442.                 Pop     DI
  1443.                 Pop     SI
  1444.                 Pop     DX
  1445.                 Pop     CX
  1446.                 Pop     BX
  1447.                 Pop     AX
  1448.  
  1449.                 Jmp     DefaultDOS
  1450.  
  1451.  
  1452.  
  1453.  
  1454. ;-----------------------------------------------------------------;
  1455. ;       Handle Create-New Function Call                           ;
  1456. ;-----------------------------------------------------------------;
  1457.  
  1458. DoCreateNew:
  1459.                 CallDOS CreateNewOp
  1460.                 JNC     DoCreateNew_0
  1461.                 Jmp     BadDOS
  1462.  
  1463. DoCreateNew_0:
  1464.                 Jmp     DoCreate_1
  1465.  
  1466.  
  1467.  
  1468.  
  1469.  
  1470. ;-----------------------------------------------------------------;
  1471. ;       Handle FCB Open Function Call                             ;
  1472. ;-----------------------------------------------------------------;
  1473.  
  1474. DoFCBOpen:
  1475.                 Push    AX              ; save registers
  1476.                 Push    BX
  1477.                 Push    CX
  1478.                 Push    DX
  1479.                 Push    SI
  1480.                 Push    DI
  1481.                 Push    BP
  1482.                 Push    ES
  1483.                 Push    DS
  1484.  
  1485.  
  1486.                 Mov     CS:OldSP, SP
  1487.                 Mov     CS:OldSS, SS
  1488.  
  1489.                 CLI                     ; use our stack
  1490.                 Mov     SS, CS:OurSS
  1491.                 Mov     SP, CS:OurSP
  1492.                 STI
  1493.  
  1494.                 Mov     CS:R_DX, DX
  1495.                 Mov     CS:R_DS, DS
  1496.                 Mov     CS:FCBOfs, DX
  1497.                 Mov     CS:FCBSeg, DS
  1498.  
  1499.                 Push    CS              ; addressability to this segment
  1500.                 Pop     DS
  1501.                 Push    DS
  1502.                 Pop     ES
  1503.                 CLD
  1504.  
  1505.                 Call    GetOldPID
  1506.  
  1507.                 Call    SearchFCBTable
  1508.                 JC      FCBOpen_0
  1509.  
  1510.                 Mov     SI, TablePtr
  1511.                 Mov     BX, FileHandleTbl [SI]
  1512.                 Mov     CurrHandle, BX
  1513.  
  1514.                 Jmp     FCBOpen_7
  1515.  
  1516. ; Parse FCB name into NameBuffer and then do a regular handle-open.
  1517.  
  1518. FCBOpen_0:
  1519.                 Call    ParseFCBName
  1520.  
  1521.                 Mov     DX, Offset NameBuffer
  1522.                 Mov     AL, 02
  1523.                 CallDOS OpenOp
  1524.                 JNC     FCBOpenOk
  1525.                 Mov     DX, Offset NameBuffer
  1526.                 Mov     AL, 00
  1527.                 CallDOS OpenOp
  1528.                 JNC     FCBOpenOk
  1529.  
  1530.                 Jmp     FCBOpen_9
  1531.  
  1532. FCBOpenOk:
  1533.                 Mov     CurrHandle, AX
  1534.                 Call    GetOldPID       ; which process is opening a file?
  1535.                 Call    SearchTable     ; get a TablePtr value
  1536.  
  1537. FCBOpen_5:
  1538.                 Cmp     AskFlag, 2
  1539.                 JNE     FCBOpen_5A
  1540.                 
  1541.                 Mov     BX, CurrHandle
  1542.                 CallDOS CloseOp
  1543.                 Jmp     FCBOpen_9
  1544.  
  1545. FCBOpen_5A:     Call    ReadFootPrint   ; look for our footprint
  1546.                 JNC     FCBOpen_5B
  1547.  
  1548.                 Mov     BX, CurrHandle
  1549.                 CallDOS CloseOp
  1550.                 Jmp     FCBOpen_9       ; not there...it's not skinny
  1551.  
  1552. FCBOpen_5B:
  1553.                 Cmp     AskFlag, 1
  1554.                 JNE     FCBOpen_7
  1555.  
  1556.                 Call    SaveLine25
  1557.                 JC      FCBOpen_7
  1558.  
  1559.                 Mov     DX, 1800h
  1560.                 Mov     AnswerPos, 0
  1561.                 Mov     DI, Offset AskMessage1
  1562.                 Mov     CX, AMLen1
  1563.                 Add     AnswerPos, CX
  1564.                 Call    AttrCharOut
  1565.  
  1566.                 Mov     DI, Offset NameBuffer
  1567.                 Mov     CX, CreateLength
  1568.                 Add     AnswerPos, CX
  1569.                 Call    AttrCharOut
  1570.                 Mov     DI, Offset AskMessage2
  1571.                 Mov     CX, AMLen2
  1572.                 Add     AnswerPos, CX
  1573.                 Call    AttrCharOut
  1574.  
  1575. FCBGetAnswer:      
  1576.                 Mov     AH, 2
  1577.                 Mov     BH, 0
  1578.                 Mov     DX, 1800h
  1579.                 Add     DX, AnswerPos
  1580.                 Dec     DX
  1581.                 Dec     DX
  1582.                 Int     10h
  1583.  
  1584.                 Mov     AH, 0
  1585.                 Int     16h
  1586.                 Cmp     AL, 'Y'
  1587.                 JE      FCBAnswerIsYes
  1588.                 Cmp     AL, 'y'
  1589.                 JE      FCBAnswerIsYes
  1590.                 Cmp     AL, 'N'
  1591.                 JE      FCBAnswerIsNo
  1592.                 Cmp     AL, 'n'
  1593.                 JE      FCBAnswerIsNo
  1594.                 Jmp     FCBGetAnswer
  1595.  
  1596. FCBAnswerIsNo:
  1597.                 Call    RestLine25
  1598.                 Mov     BX, CurrHandle
  1599.                 CallDOS CloseOp
  1600.                 Jmp     FCBOpen_9
  1601.  
  1602. FCBAnswerIsYes:
  1603.                 Call    RestLine25
  1604. FCBOpen_7:
  1605.                 Call    RememberThisFile ; save file handle, etc. in table
  1606.  
  1607.                 Mov     AX, CurrHandle
  1608.                 Mov     GetCtrlHandle, AX
  1609.                 Mov     GetPtrsHandle, AX
  1610.                 Mov     AX, OldPID
  1611.                 Mov     GetCtrlPID, AX
  1612.                 Mov     GetPtrsPID, AX
  1613.                 Call    GetControlRec
  1614.                 Mov     PointerBlock, 0
  1615.                 Call    GetPointerRec
  1616.  
  1617.                 LES     DI, FCBPtr
  1618.                 Cmp     Byte Ptr ES:[DI], 0FFh
  1619.                 JNE     FCBOpen_7A
  1620.                 Add     DI, 7
  1621. FCBOpen_7A:
  1622.                 Mov     BP, DI
  1623.                 Cmp     Byte Ptr ES:[DI], 0
  1624.                 JNE     FCBOpen_7B
  1625.  
  1626.                 CallDOS CurrentDiskOp
  1627.                 Inc     AL
  1628.                 Mov     Byte Ptr ES:[DI], AL
  1629.  
  1630. FCBOpen_7B:
  1631.                 Mov     Word Ptr ES:[DI+12], 0
  1632.                 Mov     Word Ptr ES:[DI+14], 80h
  1633.                 Mov     BX, CurrHandle
  1634.                 Mov     AL, 0
  1635.                 CallDOS FDateTimeOp
  1636.                 Mov     Word Ptr ES:[DI+20], DX
  1637.  
  1638.                 Mov     AX, Word Ptr Ctrl_FileLen
  1639.                 Mov     Word Ptr ES:[DI+16], AX
  1640.                 Mov     AX, Word Ptr Ctrl_FileLen+2
  1641.                 Mov     Word Ptr ES:[DI+18], AX
  1642.  
  1643.                 Push    DS
  1644.                 Pop     ES
  1645.  
  1646.                 Mov     AX, 12
  1647.                 Mul     TablePtr
  1648.                 Mov     DI, Offset FCBTable
  1649.                 Add     DI, AX
  1650.                 Mov     CX, 6
  1651.                 Push    DS
  1652.                 Mov     DS, FCBSeg
  1653.                 Mov     SI, BP
  1654.         Rep     MovSW
  1655.                 Pop     DS
  1656.  
  1657. FCBOpen_8:
  1658.                 Mov     R_AX, 0F00h
  1659.                 CLI                     ; restore user's stack
  1660.                 Mov     SS, CS:OldSS
  1661.                 Mov     SP, CS:OldSP
  1662.                 STI
  1663.  
  1664.                 Pop     DS              ; request satisfied....
  1665.                 Pop     ES              ; go back to the application
  1666.                 Pop     BP
  1667.                 Pop     DI
  1668.                 Pop     SI
  1669.                 Pop     DX
  1670.                 Pop     CX
  1671.                 Pop     BX
  1672.                 Pop     AX
  1673.                 Mov     AX, CS:R_AX
  1674.  
  1675.                 Jmp     ExitDOS
  1676.  
  1677.  
  1678.  
  1679. FCBOpen_9:
  1680.                 CLI                     ; restore user's stack
  1681.                 Mov     SS, CS:OldSS
  1682.                 Mov     SP, CS:OldSP
  1683.                 STI
  1684.  
  1685.                 Pop     DS
  1686.                 Pop     ES
  1687.                 Pop     BP
  1688.                 Pop     DI
  1689.                 Pop     SI
  1690.                 Pop     DX
  1691.                 Pop     CX
  1692.                 Pop     BX
  1693.                 Pop     AX
  1694.  
  1695.                 Jmp     DefaultDOS
  1696.  
  1697.  
  1698.  
  1699.  
  1700. ;-----------------------------------------------------------------;
  1701. ;       Handle FCB Close Function Call                            ;
  1702. ;-----------------------------------------------------------------;
  1703.  
  1704. DoFCBClose:
  1705.                 Push    AX              ; save registers
  1706.                 Push    BX
  1707.                 Push    CX
  1708.                 Push    DX
  1709.                 Push    SI
  1710.                 Push    DI
  1711.                 Push    BP
  1712.                 Push    ES
  1713.                 Push    DS
  1714.  
  1715.  
  1716.                 Mov     CS:OldSP, SP
  1717.                 Mov     CS:OldSS, SS
  1718.  
  1719.                 CLI                     ; use our stack
  1720.                 Mov     SS, CS:OurSS
  1721.                 Mov     SP, CS:OurSP
  1722.                 STI
  1723.  
  1724.                 Mov     CS:R_DX, DX
  1725.                 Mov     CS:R_DS, DS
  1726.                 Mov     CS:FCBOfs, DX
  1727.                 Mov     CS:FCBSeg, DS
  1728.  
  1729.                 Push    CS              ; addressability to this segment
  1730.                 Pop     DS
  1731.                 Push    DS
  1732.                 Pop     ES
  1733.                 CLD
  1734.  
  1735. ;
  1736. ; Find out who's calling us, and for what file.
  1737. ; Is it one of our skinny files?
  1738.  
  1739.                 Call    SearchFCBTable
  1740.                 JNC     FCBClose_ThisOne
  1741.  
  1742.                 Jmp     DoFCBClose_9    ; not one of ours (let DOS do it)
  1743.  
  1744. FCBClose_ThisOne:
  1745.                 Mov     SI, TablePtr
  1746.                 Mov     BX, FileHandleTbl [SI]
  1747.                 Mov     CurrHandle, BX
  1748.                 Call    GetOldPID       ; process that's closing a file
  1749.  
  1750.                 Mov     BX, CurrHandle
  1751.                 Cmp     BX, DeCompHandle
  1752.                 JNE     FCBClose_7
  1753.  
  1754.                 Mov     AL, 0
  1755.                 CallDOS FDateTimeOp
  1756.                 Push    CX
  1757.                 Push    DX
  1758.                 Call    PutBlock
  1759.                 Call    WritePointerRec
  1760.                 Call    WriteTheCtrlRec
  1761.                 Pop     DX
  1762.                 Pop     CX
  1763.                 Mov     BX, CurrHandle
  1764.                 Mov     AL, 1
  1765.                 CallDOS FDateTimeOp
  1766.  
  1767. FCBClose_7:
  1768.                 Call    ForgetThisFile
  1769.                 Mov     BX, CurrHandle
  1770.                 CallDOS CloseOp
  1771.  
  1772.                 Push    DS
  1773.                 Pop     ES
  1774.                 Mov     DI, FCBTablePtr
  1775.                 Mov     CX, 6
  1776.                 Mov     AX, 2020h
  1777.         Rep     StoSW
  1778.  
  1779. DoFCBClose_8:
  1780.                 Mov     R_AX, 1000h
  1781.                 CLI                     ; restore user's stack
  1782.                 Mov     SS, CS:OldSS
  1783.                 Mov     SP, CS:OldSP
  1784.                 STI
  1785.  
  1786.                 Pop     DS              ; request satisfied....
  1787.                 Pop     ES              ; go back to the application
  1788.                 Pop     BP
  1789.                 Pop     DI
  1790.                 Pop     SI
  1791.                 Pop     DX
  1792.                 Pop     CX
  1793.                 Pop     BX
  1794.                 Pop     AX
  1795.                 Mov     AX, CS:R_AX
  1796.  
  1797.                 Jmp     ExitDOS
  1798.  
  1799.  
  1800.  
  1801. DoFCBClose_9:
  1802.                 CLI                     ; restore user's stack
  1803.                 Mov     SS, CS:OldSS
  1804.                 Mov     SP, CS:OldSP
  1805.                 STI
  1806.  
  1807.                 Pop     DS
  1808.                 Pop     ES
  1809.                 Pop     BP
  1810.                 Pop     DI
  1811.                 Pop     SI
  1812.                 Pop     DX
  1813.                 Pop     CX
  1814.                 Pop     BX
  1815.                 Pop     AX
  1816.  
  1817.                 Jmp     DefaultDOS
  1818.  
  1819.  
  1820.  
  1821.  
  1822. ;-----------------------------------------------------------------;
  1823. ;       Handle FCB Seq Read Function Call                         ;
  1824. ;-----------------------------------------------------------------;
  1825.  
  1826. DoFCBSeqRead:
  1827.                 Push    AX              ; save registers
  1828.                 Push    BX
  1829.                 Push    CX
  1830.                 Push    DX
  1831.                 Push    SI
  1832.                 Push    DI
  1833.                 Push    BP
  1834.                 Push    ES
  1835.                 Push    DS
  1836.  
  1837.  
  1838.                 Mov     CS:OldSP, SP
  1839.                 Mov     CS:OldSS, SS
  1840.  
  1841.                 CLI                     ; use our stack
  1842.                 Mov     SS, CS:OurSS
  1843.                 Mov     SP, CS:OurSP
  1844.                 STI
  1845.  
  1846.                 Mov     CS:R_DX, DX
  1847.                 Mov     CS:R_DS, DS
  1848.                 Mov     CS:FCBOfs, DX
  1849.                 Mov     CS:FCBSeg, DS
  1850.  
  1851.  
  1852.                 Push    CS              ; addressability to this segment
  1853.                 Pop     DS
  1854.                 Push    DS
  1855.                 Pop     ES
  1856.                 CLD
  1857.  
  1858. ;
  1859. ; Find out who's calling us, and for what file.
  1860. ; Is it one of our skinny files?
  1861.  
  1862.                 Call    SearchFCBTable
  1863.                 JNC     DoFCBSeqRead_0  ; it's a skinny file
  1864.  
  1865.                 Jmp     DoFCBSeqRead_9  ; not one of ours (let DOS do it)
  1866.  
  1867. DoFCBSeqRead_0:
  1868.                 Mov     SI, TablePtr
  1869.                 Mov     AX, FileHandleTbl [SI]
  1870.                 Mov     CurrHandle, AX
  1871.                 Call    GetOldPID
  1872.  
  1873.                 CallDOS GetDTAOp
  1874.                 Mov     R_DX, BX
  1875.                 Mov     R_DS, ES
  1876.  
  1877.                 LES     DI, FCBPtr
  1878.                 Cmp     Byte Ptr ES:[DI], 0FFh
  1879.                 JNE     FCBSeqReadNotExt
  1880.                 Add     DI, 7
  1881. FCBSeqReadNotExt:
  1882.                 Mov     CX, Word Ptr ES:[DI+14]
  1883.                 Mov     R_CX, CX
  1884.  
  1885.                 Xor     AX, AX
  1886.                 Mov     AL, Byte Ptr ES:[DI+32]
  1887.                 Mov     BP, AX
  1888.                 Mov     AX, 128
  1889.                 Mul     Word Ptr ES:[DI+12]
  1890.                 Add     AX, BP
  1891.                 Adc     DX, 0
  1892.  
  1893.                 Mov     BX, Word Ptr ES:[DI+14]
  1894.                 XOR     CX, CX
  1895.  
  1896.                 XCHG    AX,SI
  1897.                 XCHG    AX,DX
  1898.                 TEST    AX,AX
  1899.                 JZ      LMul2A
  1900.                 MUL     BX
  1901. LMul2A:         XCHG    AX,CX
  1902.                 TEST    AX,AX
  1903.                 JZ      LMul3A
  1904.                 MUL     SI
  1905.                 ADD     CX,AX
  1906. LMul3A:         XCHG    AX,SI
  1907.                 MUL     BX
  1908.                 ADD     DX,CX
  1909.  
  1910.                 Mov     SI, TablePtr
  1911.                 Shl     SI, 1
  1912.                 Mov     Word Ptr FilePosTbl [SI], AX
  1913.                 Mov     Word Ptr FilePosTbl [SI+2], DX
  1914.  
  1915.                 Call    Get_CX_Bytes_To_DSDX
  1916.  
  1917.                 Mov     R_AX, 1400h
  1918.                 Cmp     R_CX, 0
  1919.                 JE      FCBSeqRead_5
  1920.  
  1921.                 Cmp     BytesMoved, 0
  1922.                 JA      FCBSeqReadSomeBytes
  1923.  
  1924.                 Mov     R_AX, 1401h
  1925.                 Jmp     FCBSeqRead_5
  1926.  
  1927. FCBSeqReadSomeBytes:
  1928.                 Mov     AX, BytesMoved
  1929.                 Cmp     AX, R_CX
  1930.                 JE      FCBSeqRead_5
  1931.  
  1932.                 Mov     R_AX, 1403h
  1933.  
  1934. FCBSeqRead_5:
  1935.                 LES     DI, FCBPtr
  1936.                 Cmp     Byte Ptr ES:[DI], 0FFh
  1937.                 JNE     FCBSeqReadNotExt2
  1938.                 Add     DI, 7
  1939.  
  1940. FCBSeqReadNotExt2:
  1941.                 Inc     Byte Ptr ES:[DI+32]
  1942.                 Cmp     Byte Ptr ES:[DI+32], 80h
  1943.                 JB      DoFCBSeqRead_8
  1944.  
  1945.                 Mov     Byte Ptr ES:[DI+32], 0
  1946.                 Inc     Word Ptr ES:[DI+12]
  1947.  
  1948. DoFCBSeqRead_8:
  1949.                 CLI                     ; restore user's stack
  1950.                 Mov     SS, CS:OldSS
  1951.                 Mov     SP, CS:OldSP
  1952.                 STI
  1953.  
  1954.                 Pop     DS              ; request satisfied....
  1955.                 Pop     ES              ; go back to the application
  1956.                 Pop     BP
  1957.                 Pop     DI
  1958.                 Pop     SI
  1959.                 Pop     DX
  1960.                 Pop     CX
  1961.                 Pop     BX
  1962.                 Pop     AX
  1963.                 Mov     AX, CS:R_AX
  1964.  
  1965.                 Jmp     ExitDOS
  1966.  
  1967.  
  1968.  
  1969. DoFCBSeqRead_9:
  1970.                 CLI                     ; restore user's stack
  1971.                 Mov     SS, CS:OldSS
  1972.                 Mov     SP, CS:OldSP
  1973.                 STI
  1974.  
  1975.                 Pop     DS
  1976.                 Pop     ES
  1977.                 Pop     BP
  1978.                 Pop     DI
  1979.                 Pop     SI
  1980.                 Pop     DX
  1981.                 Pop     CX
  1982.                 Pop     BX
  1983.                 Pop     AX
  1984.  
  1985.                 Jmp     DefaultDOS
  1986.  
  1987.  
  1988.  
  1989.  
  1990.  
  1991. ;-----------------------------------------------------------------;
  1992. ;       Handle FCB Seq Write Function Call                        ;
  1993. ;-----------------------------------------------------------------;
  1994.  
  1995. DoFCBSeqWrite:
  1996.                 Push    AX              ; save registers
  1997.                 Push    BX
  1998.                 Push    CX
  1999.                 Push    DX
  2000.                 Push    SI
  2001.                 Push    DI
  2002.                 Push    BP
  2003.                 Push    ES
  2004.                 Push    DS
  2005.  
  2006.  
  2007.                 Mov     CS:OldSP, SP
  2008.                 Mov     CS:OldSS, SS
  2009.  
  2010.                 CLI                     ; use our stack
  2011.                 Mov     SS, CS:OurSS
  2012.                 Mov     SP, CS:OurSP
  2013.                 STI
  2014.  
  2015.                 Mov     CS:R_DX, DX
  2016.                 Mov     CS:R_DS, DS
  2017.                 Mov     CS:FCBOfs, DX
  2018.                 Mov     CS:FCBSeg, DS
  2019.  
  2020.                 Push    CS              ; addressability to this segment
  2021.                 Pop     DS
  2022.                 Push    DS
  2023.                 Pop     ES
  2024.                 CLD
  2025.  
  2026. ;
  2027. ; Find out who's calling us, and for what file.
  2028. ; Is it one of our skinny files?
  2029.  
  2030.                 Call    SearchFCBTable
  2031.                 JNC     DoFCBSeqWrite_0  ; it's a skinny file
  2032.  
  2033.                 Jmp     DoFCBSeqWrite_9  ; not one of ours (let DOS do it)
  2034.  
  2035. DoFCBSeqWrite_0:
  2036.                 Mov     SI, TablePtr
  2037.                 Mov     AX, FileHandleTbl [SI]
  2038.                 Mov     CurrHandle, AX
  2039.                 Call    GetOldPID
  2040.  
  2041.                 CallDOS GetDTAOp
  2042.                 Mov     R_DX, BX
  2043.                 Mov     R_DS, ES
  2044.  
  2045.                 LES     DI, FCBPtr
  2046.                 Cmp     Byte Ptr ES:[DI], 0FFh
  2047.                 JNE     FCBSeqWriteNotExt
  2048.                 Add     DI, 7
  2049. FCBSeqWriteNotExt:
  2050.                 Mov     CX, Word Ptr ES:[DI+14]
  2051.                 Mov     R_CX, CX
  2052.  
  2053.                 Xor     AX, AX
  2054.                 Mov     AL, Byte Ptr ES:[DI+32]
  2055.                 Mov     BP, AX
  2056.                 Mov     AX, 128
  2057.                 Mul     Word Ptr ES:[DI+12]
  2058.                 Add     AX, BP
  2059.                 Adc     DX, 0
  2060.  
  2061.                 Mov     BX, Word Ptr ES:[DI+14]
  2062.                 XOR     CX, CX
  2063.  
  2064.                 XCHG    AX,SI
  2065.                 XCHG    AX,DX
  2066.                 TEST    AX,AX
  2067.                 JZ      LMul2B
  2068.                 MUL     BX
  2069. LMul2B:         XCHG    AX,CX
  2070.                 TEST    AX,AX
  2071.                 JZ      LMul3B
  2072.                 MUL     SI
  2073.                 ADD     CX,AX
  2074. LMul3B:         XCHG    AX,SI
  2075.                 MUL     BX
  2076.                 ADD     DX,CX
  2077.  
  2078.                 Mov     SI, TablePtr
  2079.                 Shl     SI, 1
  2080.                 Mov     Word Ptr FilePosTbl [SI], AX
  2081.                 Mov     Word Ptr FilePosTbl [SI+2], DX
  2082.  
  2083.                 Call    Put_CX_Bytes_From_DSDX
  2084.  
  2085.                 Mov     R_AX, 1500h
  2086.  
  2087.                 Mov     AX, BytesMoved
  2088.                 Cmp     AX, R_CX
  2089.                 JE      FCBSeqWrite_5
  2090.  
  2091.                 Mov     R_AX, 1501h
  2092.  
  2093. FCBSeqWrite_5:
  2094.                 LES     DI, FCBPtr
  2095.                 Cmp     Byte Ptr ES:[DI], 0FFh
  2096.                 JNE     FCBSeqWriteNotExt2
  2097.                 Add     DI, 7
  2098.  
  2099. FCBSeqWriteNotExt2:
  2100.                 Inc     Byte Ptr ES:[DI+32]
  2101.                 Cmp     Byte Ptr ES:[DI+32], 80h
  2102.                 JB      FCBSeqWriteSameBlock
  2103.  
  2104.                 Mov     Byte Ptr ES:[DI+32], 0
  2105.                 Inc     Word Ptr ES:[DI+12]
  2106.  
  2107. FCBSeqWriteSameBlock:
  2108.                 Mov     AX, Word Ptr Ctrl_FileLen
  2109.                 Mov     Word Ptr ES:[DI+16], AX
  2110.                 Mov     AX, Word Ptr Ctrl_FileLen+2
  2111.                 Mov     Word Ptr ES:[DI+18], AX
  2112.  
  2113. DoFCBSeqWrite_8:
  2114.                 CLI                     ; restore user's stack
  2115.                 Mov     SS, CS:OldSS
  2116.                 Mov     SP, CS:OldSP
  2117.                 STI
  2118.  
  2119.                 Pop     DS              ; request satisfied....
  2120.                 Pop     ES              ; go back to the application
  2121.                 Pop     BP
  2122.                 Pop     DI
  2123.                 Pop     SI
  2124.                 Pop     DX
  2125.                 Pop     CX
  2126.                 Pop     BX
  2127.                 Pop     AX
  2128.                 Mov     AX, CS:R_AX
  2129.  
  2130.                 Jmp     ExitDOS
  2131.  
  2132.  
  2133.  
  2134. DoFCBSeqWrite_9:
  2135.                 CLI                     ; restore user's stack
  2136.                 Mov     SS, CS:OldSS
  2137.                 Mov     SP, CS:OldSP
  2138.                 STI
  2139.  
  2140.                 Pop     DS
  2141.                 Pop     ES
  2142.                 Pop     BP
  2143.                 Pop     DI
  2144.                 Pop     SI
  2145.                 Pop     DX
  2146.                 Pop     CX
  2147.                 Pop     BX
  2148.                 Pop     AX
  2149.  
  2150.                 Jmp     DefaultDOS
  2151.  
  2152.  
  2153.  
  2154.  
  2155.  
  2156. ;-----------------------------------------------------------------;
  2157. ;       Handle FCB Create Function Call                           ;
  2158. ;-----------------------------------------------------------------;
  2159.  
  2160. DoFCBCreate:
  2161.                 Push    AX              ; save registers
  2162.                 Push    BX
  2163.                 Push    CX
  2164.                 Push    DX
  2165.                 Push    SI
  2166.                 Push    DI
  2167.                 Push    BP
  2168.                 Push    ES
  2169.                 Push    DS
  2170.  
  2171.                 Mov     CS:OldSP, SP
  2172.                 Mov     CS:OldSS, SS
  2173.  
  2174.                 CLI                     ; use our stack
  2175.                 Mov     SS, CS:OurSS
  2176.                 Mov     SP, CS:OurSP
  2177.                 STI
  2178.  
  2179.                 Mov     CS:FCBOfs, DX
  2180.                 Mov     CS:FCBSeg, DS
  2181.  
  2182.                 Push    CS              ; addressability to this segment
  2183.                 Pop     DS
  2184.                 Push    DS
  2185.                 Pop     ES
  2186.                 CLD
  2187.  
  2188.                 Call    GetOldPID
  2189.  
  2190.                 Call    SearchFCBTable
  2191.                 JC      FCBCreate_0
  2192.  
  2193.                 Mov     SI, TablePtr
  2194.                 Mov     BX, FileHandleTbl [SI]
  2195.                 Mov     CurrHandle, BX
  2196.                 CallDOS CloseOp
  2197.                 Call    ParseFCBName
  2198.                 Mov     DX, Offset NameBuffer
  2199.                 CallDOS DeleteOp
  2200.                 Call    ForgetThisFile
  2201.  
  2202.                 Push    DS
  2203.                 Pop     ES
  2204.                 Mov     DI, FCBTablePtr
  2205.                 Mov     CX, 6
  2206.                 Mov     AX, 2020h
  2207.         Rep     StoSW
  2208.  
  2209.  
  2210. ; Parse FCB name into FootBuffer and then do a regular handle-create.
  2211.  
  2212. FCBCreate_0:
  2213.                 Call    ParseFCBName
  2214.                 Mov     CX, CreateLength
  2215.                 Inc     CX
  2216.                 Mov     DI, Offset FootBuffer
  2217.                 Mov     SI, Offset NameBuffer
  2218.         Rep     MovSB
  2219.  
  2220.                 Mov     R_DX, Offset FootBuffer
  2221.                 Mov     R_DS, DS
  2222.  
  2223.                 Call    SearchDietDir
  2224.                 JNC     FCBCreate_1
  2225.  
  2226.                 Jmp     FCBCreate_9
  2227.  
  2228. FCBCreate_1:
  2229.                 Mov     DX, Offset FootBuffer
  2230.                 Mov     CX, 0
  2231.                 CallDOS CreateOp
  2232.                 JNC     FCBCreateOk
  2233.  
  2234.                 Jmp     FCBCreate_9
  2235.  
  2236. FCBCreateOk:
  2237.                 Mov     CurrHandle, AX
  2238.                 Call    SearchTable     ; get a TablePtr value
  2239.  
  2240.                 Call    WriteInitControl ; initialize skinny file
  2241.                 Call    RememberThisFile
  2242.  
  2243.  
  2244. FCBCreatedAlready:
  2245.                 LES     DI, FCBPtr
  2246.                 Cmp     Byte Ptr ES:[DI], 0FFh
  2247.                 JNE     FCBCreate_7A
  2248.                 Add     DI, 7
  2249. FCBCreate_7A:
  2250.                 Mov     BP, DI
  2251.                 Cmp     Byte Ptr ES:[DI], 0
  2252.                 JNE     FCBCreate_7B
  2253.  
  2254.                 CallDOS CurrentDiskOp
  2255.                 Inc     AL
  2256.                 Mov     Byte Ptr ES:[DI], AL
  2257.  
  2258. FCBCreate_7B:
  2259.                 Mov     Word Ptr ES:[DI+12], 0
  2260.                 Mov     Word Ptr ES:[DI+14], 80h
  2261.                 Mov     BX, CurrHandle
  2262.                 Mov     AL, 0
  2263.                 CallDOS FDateTimeOp
  2264.                 Mov     Word Ptr ES:[DI+20], DX
  2265.  
  2266.                 Mov     Word Ptr ES:[DI+16], 0
  2267.                 Mov     Word Ptr ES:[DI+18], 0
  2268.  
  2269.                 Push    DS
  2270.                 Pop     ES
  2271.  
  2272.                 Mov     AX, 12
  2273.                 Mul     TablePtr
  2274.                 Mov     DI, Offset FCBTable
  2275.                 Add     DI, AX
  2276.                 Mov     CX, 6
  2277.                 Push    DS
  2278.                 Mov     DS, FCBSeg
  2279.                 Mov     SI, BP
  2280.         Rep     MovSW
  2281.                 Pop     DS
  2282.  
  2283. FCBCreate_8:
  2284.                 Mov     R_AX, 1600h
  2285.                 CLI                     ; restore user's stack
  2286.                 Mov     SS, CS:OldSS
  2287.                 Mov     SP, CS:OldSP
  2288.                 STI
  2289.  
  2290.                 Pop     DS              ; request satisfied....
  2291.                 Pop     ES              ; go back to the application
  2292.                 Pop     BP
  2293.                 Pop     DI
  2294.                 Pop     SI
  2295.                 Pop     DX
  2296.                 Pop     CX
  2297.                 Pop     BX
  2298.                 Pop     AX
  2299.                 Mov     AX, CS:R_AX
  2300.  
  2301.                 Jmp     ExitDOS
  2302.  
  2303.  
  2304.  
  2305. FCBCreate_9:
  2306.                 CLI                     ; restore user's stack
  2307.                 Mov     SS, CS:OldSS
  2308.                 Mov     SP, CS:OldSP
  2309.                 STI
  2310.  
  2311.                 Pop     DS
  2312.                 Pop     ES
  2313.                 Pop     BP
  2314.                 Pop     DI
  2315.                 Pop     SI
  2316.                 Pop     DX
  2317.                 Pop     CX
  2318.                 Pop     BX
  2319.                 Pop     AX
  2320.  
  2321.                 Jmp     DefaultDOS
  2322.  
  2323.  
  2324.  
  2325.  
  2326.  
  2327. ;-----------------------------------------------------------------;
  2328. ;       Handle FCB Rand Read Function Call                        ;
  2329. ;-----------------------------------------------------------------;
  2330.  
  2331. DoFCBRandRead:
  2332.                 Push    AX              ; save registers
  2333.                 Push    BX
  2334.                 Push    CX
  2335.                 Push    DX
  2336.                 Push    SI
  2337.                 Push    DI
  2338.                 Push    BP
  2339.                 Push    ES
  2340.                 Push    DS
  2341.  
  2342.  
  2343.                 Mov     CS:OldSP, SP
  2344.                 Mov     CS:OldSS, SS
  2345.  
  2346.                 CLI                     ; use our stack
  2347.                 Mov     SS, CS:OurSS
  2348.                 Mov     SP, CS:OurSP
  2349.                 STI
  2350.  
  2351.                 Mov     CS:R_DX, DX
  2352.                 Mov     CS:R_DS, DS
  2353.                 Mov     CS:FCBOfs, DX
  2354.                 Mov     CS:FCBSeg, DS
  2355.  
  2356.                 Push    CS              ; addressability to this segment
  2357.                 Pop     DS
  2358.                 Push    DS
  2359.                 Pop     ES
  2360.                 CLD
  2361.  
  2362.  
  2363. ;
  2364. ; Find out who's calling us, and for what file.
  2365. ; Is it one of our skinny files?
  2366. ;
  2367.  
  2368.                 Call    SearchFCBTable
  2369.                 JNC     DoFCBRndRead_0  ; it's a skinny file
  2370.  
  2371.                 Jmp     DoFCBRndRead_9  ; not one of ours (let DOS do it)
  2372.  
  2373. DoFCBRndRead_0:
  2374.                 Mov     SI, TablePtr
  2375.                 Mov     AX, FileHandleTbl [SI]
  2376.                 Mov     CurrHandle, AX
  2377.                 Call    GetOldPID
  2378.  
  2379.                 CallDOS GetDTAOp
  2380.                 Mov     R_DX, BX
  2381.                 Mov     R_DS, ES
  2382.  
  2383.                 LES     DI, FCBPtr
  2384.                 Cmp     Byte Ptr ES:[DI], 0FFh
  2385.                 JNE     FCBRndReadNotExt
  2386.                 Add     DI, 7
  2387. FCBRndReadNotExt:
  2388.                 Mov     CX, Word Ptr ES:[DI+14]
  2389.                 Mov     R_CX, CX
  2390.  
  2391.                 Mov     AX, Word Ptr ES:[DI+33]
  2392.                 Cmp     CX, 64
  2393.                 JB      FCBRndReadRecNLT64
  2394.  
  2395.                 Xor     DX, DX
  2396.                 Mov     DL, Byte Ptr ES:[DI+35]
  2397.                 Jmp     FCBRndReadGotRecN
  2398.  
  2399. FCBRndReadRecNLT64:
  2400.                 Mov     DX, Word Ptr ES:[DI+35]
  2401.  
  2402. FCBRndReadGotRecN:
  2403.                 Push    AX
  2404.                 Push    DX
  2405.  
  2406.                 Mov     CX, 128
  2407.                 DIV     CX
  2408.                 Mov     Word Ptr ES:[DI+12], AX
  2409.                 Mov     Byte Ptr ES:[DI+32], DL
  2410.  
  2411.                 Pop     DX
  2412.                 Pop     AX
  2413.                 Mov     BX, Word Ptr ES:[DI+14]
  2414.                 XOR     CX, CX
  2415.  
  2416.                 XCHG    AX,SI
  2417.                 XCHG    AX,DX
  2418.                 TEST    AX,AX
  2419.                 JZ      LMul2C
  2420.                 MUL     BX
  2421. LMul2C:         XCHG    AX,CX
  2422.                 TEST    AX,AX
  2423.                 JZ      LMul3C
  2424.                 MUL     SI
  2425.                 ADD     CX,AX
  2426. LMul3C:         XCHG    AX,SI
  2427.                 MUL     BX
  2428.                 ADD     DX,CX
  2429.  
  2430.                 Mov     SI, TablePtr
  2431.                 Shl     SI, 1
  2432.                 Mov     Word Ptr FilePosTbl [SI], AX
  2433.                 Mov     Word Ptr FilePosTbl [SI+2], DX
  2434.  
  2435.                 Call    Get_CX_Bytes_To_DSDX
  2436.  
  2437.                 Mov     R_AX, 2100h
  2438.                 Cmp     R_CX, 0
  2439.                 JE      FCBRndRead_5
  2440.  
  2441.                 Cmp     BytesMoved, 0
  2442.                 JA      FCBRndReadSomeBytes
  2443.  
  2444.                 Mov     R_AX, 2101h
  2445.                 Jmp     FCBRndRead_5
  2446.  
  2447. FCBRndReadSomeBytes:
  2448.                 Mov     AX, BytesMoved
  2449.                 Cmp     AX, R_CX
  2450.                 JE      FCBRndRead_5
  2451.  
  2452.                 Mov     R_AX, 2103h
  2453.  
  2454. FCBRndRead_5:
  2455.  
  2456. DoFCBRandRead_8:
  2457.                 CLI                     ; restore user's stack
  2458.                 Mov     SS, CS:OldSS
  2459.                 Mov     SP, CS:OldSP
  2460.                 STI
  2461.  
  2462.                 Pop     DS              ; request satisfied....
  2463.                 Pop     ES              ; go back to the application
  2464.                 Pop     BP
  2465.                 Pop     DI
  2466.                 Pop     SI
  2467.                 Pop     DX
  2468.                 Pop     CX
  2469.                 Pop     BX
  2470.                 Pop     AX
  2471.                 Mov     AX, CS:R_AX
  2472.  
  2473.                 Jmp     ExitDOS
  2474.  
  2475.  
  2476.  
  2477. DoFCBRndRead_9:
  2478.                 CLI                     ; restore user's stack
  2479.                 Mov     SS, CS:OldSS
  2480.                 Mov     SP, CS:OldSP
  2481.                 STI
  2482.  
  2483.                 Pop     DS
  2484.                 Pop     ES
  2485.                 Pop     BP
  2486.                 Pop     DI
  2487.                 Pop     SI
  2488.                 Pop     DX
  2489.                 Pop     CX
  2490.                 Pop     BX
  2491.                 Pop     AX
  2492.  
  2493.                 Jmp     DefaultDOS
  2494.  
  2495.  
  2496.  
  2497.  
  2498.  
  2499. ;-----------------------------------------------------------------;
  2500. ;       Handle FCB Rand Write Function Call                       ;
  2501. ;-----------------------------------------------------------------;
  2502.  
  2503. DoFCBRandWrite:
  2504.                 Push    AX              ; save registers
  2505.                 Push    BX
  2506.                 Push    CX
  2507.                 Push    DX
  2508.                 Push    SI
  2509.                 Push    DI
  2510.                 Push    BP
  2511.                 Push    ES
  2512.                 Push    DS
  2513.  
  2514.                 Mov     CS:OldSP, SP
  2515.                 Mov     CS:OldSS, SS
  2516.  
  2517.                 CLI                     ; use our stack
  2518.                 Mov     SS, CS:OurSS
  2519.                 Mov     SP, CS:OurSP
  2520.                 STI
  2521.  
  2522.                 Mov     CS:R_DX, DX
  2523.                 Mov     CS:R_DS, DS
  2524.                 Mov     CS:FCBOfs, DX
  2525.                 Mov     CS:FCBSeg, DS
  2526.  
  2527.                 Push    CS              ; addressability to this segment
  2528.                 Pop     DS
  2529.                 Push    DS
  2530.                 Pop     ES
  2531.                 CLD
  2532.  
  2533. ;
  2534. ; Find out who's calling us, and for what file.
  2535. ; Is it one of our skinny files?
  2536. ;
  2537.  
  2538.                 Call    SearchFCBTable
  2539.                 JNC     DoFCBRndWrite_0  ; it's a skinny file
  2540.  
  2541.                 Jmp     DoFCBRndWrite_9  ; not one of ours (let DOS do it)
  2542.  
  2543. DoFCBRndWrite_0:
  2544.                 Mov     SI, TablePtr
  2545.                 Mov     AX, FileHandleTbl [SI]
  2546.                 Mov     CurrHandle, AX
  2547.                 Call    GetOldPID
  2548.  
  2549.                 CallDOS GetDTAOp
  2550.                 Mov     R_DX, BX
  2551.                 Mov     R_DS, ES
  2552.  
  2553.                 LES     DI, FCBPtr
  2554.                 Cmp     Byte Ptr ES:[DI], 0FFh
  2555.                 JNE     FCBRndWriteNotExt
  2556.                 Add     DI, 7
  2557. FCBRndWriteNotExt:
  2558.                 Mov     CX, Word Ptr ES:[DI+14]
  2559.                 Mov     R_CX, CX
  2560.  
  2561.                 Mov     AX, Word Ptr ES:[DI+33]
  2562.                 Cmp     Word Ptr ES:[DI+14], 64
  2563.                 JB      FCBRndWriteRecNLT64
  2564.  
  2565.                 Xor     DX, DX
  2566.                 Mov     DL, Byte Ptr ES:[DI+35]
  2567.                 Jmp     FCBRndWriteGotRecN
  2568.  
  2569. FCBRndWriteRecNLT64:
  2570.                 Mov     DX, Word Ptr ES:[DI+35]
  2571.  
  2572. FCBRndWriteGotRecN:
  2573.                 Push    AX
  2574.                 Push    DX
  2575.  
  2576.                 Mov     CX, 128
  2577.                 DIV     CX
  2578.                 Mov     Word Ptr ES:[DI+12], AX
  2579.                 Mov     Byte Ptr ES:[DI+32], DL
  2580.  
  2581.                 Pop     DX
  2582.                 Pop     AX
  2583.                 Mov     BX, Word Ptr ES:[DI+14]
  2584.                 XOR     CX, CX
  2585.  
  2586.                 XCHG    AX,SI
  2587.                 XCHG    AX,DX
  2588.                 TEST    AX,AX
  2589.                 JZ      LMul2D
  2590.                 MUL     BX
  2591. LMul2D:         XCHG    AX,CX
  2592.                 TEST    AX,AX
  2593.                 JZ      LMul3D
  2594.                 MUL     SI
  2595.                 ADD     CX,AX
  2596. LMul3D:         XCHG    AX,SI
  2597.                 MUL     BX
  2598.                 ADD     DX,CX
  2599.  
  2600.                 Mov     SI, TablePtr
  2601.                 Shl     SI, 1
  2602.                 Mov     Word Ptr FilePosTbl [SI], AX
  2603.                 Mov     Word Ptr FilePosTbl [SI+2], DX
  2604.  
  2605.                 Call    Put_CX_Bytes_From_DSDX
  2606.  
  2607.                 Mov     R_AX, 2200h
  2608.                 Mov     CX, R_CX
  2609.                 Cmp     BytesMoved, CX
  2610.                 JE      DoFCBRandWrite_8
  2611.  
  2612.                 Mov     R_AX, 2201h
  2613.  
  2614. DoFCBRandWrite_8:
  2615.                 LES     DI, FCBPtr
  2616.                 Cmp     Byte Ptr ES:[DI], 0FFh
  2617.                 JNE     FCBRandWrite_AdjLen
  2618.                 Add     DI, 7
  2619.  
  2620. FCBRandWrite_AdjLen:
  2621.                 Mov     AX, Word Ptr Ctrl_FileLen
  2622.                 Mov     Word Ptr ES:[DI+16], AX
  2623.                 Mov     AX, Word Ptr Ctrl_FileLen+2
  2624.                 Mov     Word Ptr ES:[DI+18], AX
  2625.  
  2626. DoFCBRandWrite_8A:
  2627.                 CLI                     ; restore user's stack
  2628.                 Mov     SS, CS:OldSS
  2629.                 Mov     SP, CS:OldSP
  2630.                 STI
  2631.  
  2632.                 Pop     DS              ; request satisfied....
  2633.                 Pop     ES              ; go back to the application
  2634.                 Pop     BP
  2635.                 Pop     DI
  2636.                 Pop     SI
  2637.                 Pop     DX
  2638.                 Pop     CX
  2639.                 Pop     BX
  2640.                 Pop     AX
  2641.                 Mov     AX, CS:R_AX
  2642.  
  2643.                 Jmp     ExitDOS
  2644.  
  2645.  
  2646.  
  2647. DoFCBRndWrite_9:
  2648.                 CLI                     ; restore user's stack
  2649.                 Mov     SS, CS:OldSS
  2650.                 Mov     SP, CS:OldSP
  2651.                 STI
  2652.  
  2653.                 Pop     DS
  2654.                 Pop     ES
  2655.                 Pop     BP
  2656.                 Pop     DI
  2657.                 Pop     SI
  2658.                 Pop     DX
  2659.                 Pop     CX
  2660.                 Pop     BX
  2661.                 Pop     AX
  2662.  
  2663.                 Jmp     DefaultDOS
  2664.  
  2665.  
  2666.  
  2667.  
  2668.  
  2669. ;-----------------------------------------------------------------;
  2670. ;       Handle FCB File Size Function Call                        ;
  2671. ;-----------------------------------------------------------------;
  2672.  
  2673. DoFCBFileSize:
  2674.                 Push    AX              ; save registers
  2675.                 Push    BX
  2676.                 Push    CX
  2677.                 Push    DX
  2678.                 Push    SI
  2679.                 Push    DI
  2680.                 Push    BP
  2681.                 Push    ES
  2682.                 Push    DS
  2683.  
  2684.  
  2685.                 Mov     CS:OldSP, SP
  2686.                 Mov     CS:OldSS, SS
  2687.  
  2688.                 CLI                     ; use our stack
  2689.                 Mov     SS, CS:OurSS
  2690.                 Mov     SP, CS:OurSP
  2691.                 STI
  2692.  
  2693.                 Mov     CS:R_DX, DX
  2694.                 Mov     CS:R_DS, DS
  2695.                 Mov     CS:FCBOfs, DX
  2696.                 Mov     CS:FCBSeg, DS
  2697.  
  2698.                 Push    CS              ; addressability to this segment
  2699.                 Pop     DS
  2700.                 Push    DS
  2701.                 Pop     ES
  2702.                 CLD
  2703.  
  2704. DoFCBFileSize_0:
  2705.                 Mov     R_AX, 0
  2706.                 Call    ParseFCBName
  2707.  
  2708.                 Mov     DX, Offset NameBuffer
  2709.                 Mov     AL, RD_ONLY
  2710.                 CallDOS OpenOp
  2711.                 JNC     DoFCBFileSize_1
  2712.  
  2713.                 Jmp     DoFCBFileSize_9
  2714.  
  2715. DoFCBFileSize_1:
  2716.                 Mov     CurrHandle, AX
  2717.                 Call    GetOldPID
  2718.  
  2719.                 Call    ReadFootPrint
  2720.                 JNC     DoFCBFileSize_3
  2721.  
  2722.                 Mov     BX, CurrHandle
  2723.                 CallDOS CloseOp
  2724.                 Jmp     DoFCBFileSize_9
  2725.  
  2726. DoFCBFileSize_3:
  2727.                 Mov     AX, CurrHandle
  2728.                 Mov     GetCtrlHandle, AX
  2729.                 Mov     AX, OldPID
  2730.                 Mov     GetCtrlPID, AX
  2731.                 Call    GetControlRec
  2732.                 Mov     AX, Word Ptr Ctrl_FileLen
  2733.                 Mov     DX, Word Ptr Ctrl_FileLen+2
  2734.  
  2735.                 LES     DI, FCBPtr
  2736.                 Cmp     Byte Ptr ES:[DI], 0FFh
  2737.                 JNE     FCBFileSizeNotExt
  2738.                 Add     DI, 7
  2739.  
  2740. FCBFileSizeNotExt:
  2741.                 Mov     BP, 0
  2742.                 Mov     BX, Word Ptr ES:[DI+14]
  2743.                 Call    LongDiv
  2744.  
  2745.                 Mov     Word Ptr ES:[DI+33], AX
  2746.  
  2747.                 Cmp     Word Ptr ES:[DI+14], 64
  2748.                 JB      FCBFileSizeLT64
  2749.                 Mov     Byte Ptr ES:[DI+35], DL
  2750.                 Jmp     FCBFileSize_7
  2751.  
  2752. FCBFileSizeLT64:
  2753.                 Mov     Word Ptr ES:[DI+35], DX
  2754.  
  2755. FCBFileSize_7:
  2756.                 Mov     BX, CurrHandle
  2757.                 CallDOS CloseOp
  2758.  
  2759. DoFCBFileSize_8:
  2760.                 Mov     R_AX, 2300h
  2761.                 CLI                     ; restore user's stack
  2762.                 Mov     SS, CS:OldSS
  2763.                 Mov     SP, CS:OldSP
  2764.                 STI
  2765.  
  2766.                 Pop     DS              ; request satisfied....
  2767.                 Pop     ES              ; go back to the application
  2768.                 Pop     BP
  2769.                 Pop     DI
  2770.                 Pop     SI
  2771.                 Pop     DX
  2772.                 Pop     CX
  2773.                 Pop     BX
  2774.                 Pop     AX
  2775.                 Mov     AX, CS:R_AX
  2776.  
  2777.                 Jmp     ExitDOS
  2778.  
  2779.  
  2780.  
  2781. DoFCBFileSize_9:
  2782.                 CLI                     ; restore user's stack
  2783.                 Mov     SS, CS:OldSS
  2784.                 Mov     SP, CS:OldSP
  2785.                 STI
  2786.  
  2787.                 Pop     DS
  2788.                 Pop     ES
  2789.                 Pop     BP
  2790.                 Pop     DI
  2791.                 Pop     SI
  2792.                 Pop     DX
  2793.                 Pop     CX
  2794.                 Pop     BX
  2795.                 Pop     AX
  2796.  
  2797.                 Jmp     DefaultDOS
  2798.  
  2799.  
  2800. ;-----------------------------------------------------------------;
  2801. ;       Handle FCB Block Read Function Call                       ;
  2802. ;-----------------------------------------------------------------;
  2803.  
  2804. DoFCBBlockRead:
  2805.                 Push    AX              ; save registers
  2806.                 Push    BX
  2807.                 Push    CX
  2808.                 Push    DX
  2809.                 Push    SI
  2810.                 Push    DI
  2811.                 Push    BP
  2812.                 Push    ES
  2813.                 Push    DS
  2814.  
  2815.  
  2816.                 Mov     CS:OldSP, SP
  2817.                 Mov     CS:OldSS, SS
  2818.  
  2819.                 CLI                     ; use our stack
  2820.                 Mov     SS, CS:OurSS
  2821.                 Mov     SP, CS:OurSP
  2822.                 STI
  2823.  
  2824.                 Mov     CS:R_CX, CX
  2825.                 Mov     CS:R_DX, DX
  2826.                 Mov     CS:R_DS, DS
  2827.                 Mov     CS:FCBOfs, DX
  2828.                 Mov     CS:FCBSeg, DS
  2829.  
  2830.                 Push    CS              ; addressability to this segment
  2831.                 Pop     DS
  2832.                 Push    DS
  2833.                 Pop     ES
  2834.                 CLD
  2835.  
  2836.  
  2837. ;
  2838. ; Find out who's calling us, and for what file.
  2839. ; Is it one of our skinny files?
  2840. ;
  2841.  
  2842.                 Call    SearchFCBTable
  2843.                 JNC     DoFCBBlkRead_0  ; it's a skinny file
  2844.  
  2845.                 Jmp     DoFCBBlkRead_9  ; not one of ours (let DOS do it)
  2846.  
  2847. DoFCBBlkRead_0:
  2848.                 Mov     SI, TablePtr
  2849.                 Mov     AX, FileHandleTbl [SI]
  2850.                 Mov     CurrHandle, AX
  2851.                 Call    GetOldPID
  2852.  
  2853.                 CallDOS GetDTAOp
  2854.                 Mov     R_DX, BX
  2855.                 Mov     R_DS, ES
  2856.  
  2857.                 LES     DI, FCBPtr
  2858.                 Cmp     Byte Ptr ES:[DI], 0FFh
  2859.                 JNE     FCBBlkReadNotExt
  2860.                 Add     DI, 7
  2861. FCBBlkReadNotExt:
  2862.                 Mov     CX, Word Ptr ES:[DI+14]
  2863.                 Mov     Junk, CX
  2864.                 Mov     AX, R_CX
  2865.                 Mul     CX
  2866.                 Mov     R_CX, AX
  2867.  
  2868.                 Mov     AX, Word Ptr ES:[DI+33]
  2869.                 Cmp     Word Ptr ES:[DI+14], 64
  2870.                 JB      FCBBlkReadRecNLT64
  2871.  
  2872.                 Xor     DX, DX
  2873.                 Mov     DL, Byte Ptr ES:[DI+35]
  2874.                 Jmp     FCBBlkReadGotRecN
  2875.  
  2876. FCBBlkReadRecNLT64:
  2877.                 Mov     DX, Word Ptr ES:[DI+35]
  2878.  
  2879. FCBBlkReadGotRecN:
  2880.                 Mov     BX, Word Ptr ES:[DI+14]
  2881.                 XOR     CX, CX
  2882.  
  2883.                 XCHG    AX,SI
  2884.                 XCHG    AX,DX
  2885.                 TEST    AX,AX
  2886.                 JZ      LMul2E
  2887.                 MUL     BX
  2888. LMul2E:         XCHG    AX,CX
  2889.                 TEST    AX,AX
  2890.                 JZ      LMul3E
  2891.                 MUL     SI
  2892.                 ADD     CX,AX
  2893. LMul3E:         XCHG    AX,SI
  2894.                 MUL     BX
  2895.                 ADD     DX,CX
  2896.  
  2897.                 Mov     SI, TablePtr
  2898.                 Shl     SI, 1
  2899.                 Mov     Word Ptr FilePosTbl [SI], AX
  2900.                 Mov     Word Ptr FilePosTbl [SI+2], DX
  2901.  
  2902.                 Call    Get_CX_Bytes_To_DSDX
  2903.  
  2904.                 Mov     R_AX, 2700h
  2905.                 Cmp     R_CX, 0
  2906.                 JE      FCBBlkRead_5
  2907.  
  2908.                 Cmp     BytesMoved, 0
  2909.                 JA      FCBBlkReadSomeBytes
  2910.  
  2911.                 Mov     R_AX, 2701h
  2912.                 Jmp     FCBBlkRead_5
  2913.  
  2914. FCBBlkReadSomeBytes:
  2915.                 Mov     AX, BytesMoved
  2916.                 Cmp     AX, R_CX
  2917.                 JE      FCBBlkRead_5
  2918.  
  2919.                 Mov     R_AX, 2701h
  2920.  
  2921. FCBBlkRead_5:
  2922.                 Mov     AX, BytesMoved
  2923.                 Xor     DX, DX
  2924.                 Div     Junk
  2925.                 Mov     R_CX, AX
  2926.  
  2927.                 LES     DI, FCBPtr
  2928.                 Cmp     Byte Ptr ES:[DI], 0FFh
  2929.                 JNE     FCBBlkRead_6
  2930.                 Add     DI, 7
  2931. FCBBlkRead_6:
  2932.                 Cmp     Word Ptr ES:[DI+14], 64
  2933.                 JAE     FCBBlkRead_6A
  2934.                 Add     Word Ptr ES:[DI+33], AX
  2935.                 Adc     Word Ptr ES:[DI+35], 0
  2936.                 Jmp     FCBBlkRead_6B
  2937.  
  2938. FCBBlkRead_6A:
  2939.                 Add     Word Ptr ES:[DI+33], AX
  2940.                 Adc     Byte Ptr ES:[DI+35], 0
  2941.  
  2942. FCBBlkRead_6B:
  2943.                 Mov     CX, AX
  2944.                 JCXZ    FCBBlkRead_8
  2945. FCBBlkRead_7:
  2946.                 Inc     Byte Ptr ES:[DI+32]
  2947.                 Cmp     Byte Ptr ES:[DI+32], 128
  2948.                 JB      FCBBlkRead_7A
  2949.  
  2950.                 Mov     Byte Ptr ES:[DI+32], 0
  2951.                 Inc     Word Ptr ES:[DI+12]
  2952. FCBBlkRead_7A:
  2953.                 Loop    FCBBlkRead_7
  2954.  
  2955. FCBBlkRead_8:
  2956.                 CLI                     ; restore user's stack
  2957.                 Mov     SS, CS:OldSS
  2958.                 Mov     SP, CS:OldSP
  2959.                 STI
  2960.  
  2961.                 Pop     DS              ; request satisfied....
  2962.                 Pop     ES              ; go back to the application
  2963.                 Pop     BP
  2964.                 Pop     DI
  2965.                 Pop     SI
  2966.                 Pop     DX
  2967.                 Pop     CX
  2968.                 Pop     BX
  2969.                 Pop     AX
  2970.                 Mov     AX, CS:R_AX
  2971.                 Mov     CX, CS:R_CX
  2972.  
  2973.                 Jmp     ExitDOS
  2974.  
  2975.  
  2976.  
  2977. DoFCBBlkRead_9:
  2978.                 CLI                     ; restore user's stack
  2979.                 Mov     SS, CS:OldSS
  2980.                 Mov     SP, CS:OldSP
  2981.                 STI
  2982.  
  2983.                 Pop     DS
  2984.                 Pop     ES
  2985.                 Pop     BP
  2986.                 Pop     DI
  2987.                 Pop     SI
  2988.                 Pop     DX
  2989.                 Pop     CX
  2990.                 Pop     BX
  2991.                 Pop     AX
  2992.  
  2993.                 Jmp     DefaultDOS
  2994.  
  2995.  
  2996.  
  2997.  
  2998.  
  2999. ;-----------------------------------------------------------------;
  3000. ;       Handle FCB Block Write Function Call                      ;
  3001. ;-----------------------------------------------------------------;
  3002.  
  3003. DoFCBBlockWrite:
  3004.                 Push    AX              ; save registers
  3005.                 Push    BX
  3006.                 Push    CX
  3007.                 Push    DX
  3008.                 Push    SI
  3009.                 Push    DI
  3010.                 Push    BP
  3011.                 Push    ES
  3012.                 Push    DS
  3013.  
  3014.  
  3015.                 Mov     CS:OldSP, SP
  3016.                 Mov     CS:OldSS, SS
  3017.  
  3018.                 CLI                     ; use our stack
  3019.                 Mov     SS, CS:OurSS
  3020.                 Mov     SP, CS:OurSP
  3021.                 STI
  3022.  
  3023.                 Mov     CS:R_CX, CX
  3024.                 Mov     CS:FCBOfs, DX
  3025.                 Mov     CS:FCBSeg, DS
  3026.  
  3027.                 Push    CS              ; addressability to this segment
  3028.                 Pop     DS
  3029.                 Push    DS
  3030.                 Pop     ES
  3031.                 CLD
  3032.  
  3033.  
  3034. ;
  3035. ; Find out who's calling us, and for what file.
  3036. ; Is it one of our skinny files?
  3037. ;
  3038.  
  3039.                 Call    SearchFCBTable
  3040.                 JNC     DoFCBBlkWrite_0  ; it's a skinny file
  3041.  
  3042.                 Jmp     DoFCBBlkWrite_9  ; not one of ours (let DOS do it)
  3043.  
  3044. DoFCBBlkWrite_0:
  3045.                 Mov     SI, TablePtr
  3046.                 Mov     AX, FileHandleTbl [SI]
  3047.                 Mov     CurrHandle, AX
  3048.                 Call    GetOldPID
  3049.  
  3050.                 CallDOS GetDTAOp
  3051.                 Mov     R_DX, BX
  3052.                 Mov     R_DS, ES
  3053.  
  3054.                 LES     DI, FCBPtr
  3055.                 Cmp     Byte Ptr ES:[DI], 0FFh
  3056.                 JNE     FCBBlkWriteNotExt
  3057.                 Add     DI, 7
  3058. FCBBlkWriteNotExt:
  3059.                 Mov     CX, Word Ptr ES:[DI+14]
  3060.                 Mov     Junk, CX
  3061.                 Mov     AX, R_CX
  3062.                 Mul     CX
  3063.                 Mov     R_CX, AX
  3064.  
  3065.                 Mov     AX, Word Ptr ES:[DI+33]
  3066.                 Cmp     Word Ptr ES:[DI+14], 64
  3067.                 JB      FCBBlkWriteRecNLT64
  3068.  
  3069.                 Xor     DX, DX
  3070.                 Mov     DL, Byte Ptr ES:[DI+35]
  3071.                 Jmp     FCBBlkWriteGotRecN
  3072.  
  3073. FCBBlkWriteRecNLT64:
  3074.                 Mov     DX, Word Ptr ES:[DI+35]
  3075.  
  3076. FCBBlkWriteGotRecN:
  3077.                 Mov     BX, Word Ptr ES:[DI+14]
  3078.                 XOR     CX, CX
  3079.  
  3080.                 XCHG    AX,SI
  3081.                 XCHG    AX,DX
  3082.                 TEST    AX,AX
  3083.                 JZ      LMul2F
  3084.                 MUL     BX
  3085. LMul2F:         XCHG    AX,CX
  3086.                 TEST    AX,AX
  3087.                 JZ      LMul3F
  3088.                 MUL     SI
  3089.                 ADD     CX,AX
  3090. LMul3F:         XCHG    AX,SI
  3091.                 MUL     BX
  3092.                 ADD     DX,CX
  3093.  
  3094.                 Mov     SI, TablePtr
  3095.                 Shl     SI, 1
  3096.                 Mov     Word Ptr FilePosTbl [SI], AX
  3097.                 Mov     Word Ptr FilePosTbl [SI+2], DX
  3098.  
  3099.                 Call    Put_CX_Bytes_From_DSDX
  3100.  
  3101.                 Mov     R_AX, 2800h
  3102.                 Mov     CX, R_CX
  3103.                 Cmp     BytesMoved, CX
  3104.                 JE      DoFCBBlkWrite_8
  3105.  
  3106.                 Mov     R_AX, 2801h
  3107.  
  3108. DoFCBBlkWrite_8:
  3109.                 LES     DI, FCBPtr
  3110.                 Cmp     Byte Ptr ES:[DI], 0FFh
  3111.                 JNE     FCBBlkWrite_AdjLen
  3112.                 Add     DI, 7
  3113.  
  3114. FCBBlkWrite_AdjLen:
  3115.                 Mov     AX, Word Ptr Ctrl_FileLen
  3116.                 Mov     Word Ptr ES:[DI+16], AX
  3117.                 Mov     AX, Word Ptr Ctrl_FileLen+2
  3118.                 Mov     Word Ptr ES:[DI+18], AX
  3119.  
  3120. DoFCBBlkWrite_8A:
  3121.                 Mov     AX, BytesMoved
  3122.                 Xor     DX, DX
  3123.                 Div     Junk
  3124.                 Mov     R_CX, AX
  3125.  
  3126.                 Cmp     Word Ptr ES:[DI+14], 64
  3127.                 JAE     FCBBlkWrite_8B
  3128.                 Add     Word Ptr ES:[DI+33], AX
  3129.                 Adc     Word Ptr ES:[DI+35], 0
  3130.                 Jmp     FCBBlkWrite_8C
  3131.  
  3132. FCBBlkWrite_8B:
  3133.                 Add     Word Ptr ES:[DI+33], AX
  3134.                 Adc     Byte Ptr ES:[DI+35], 0
  3135.  
  3136. FCBBlkWrite_8C:
  3137.                 Mov     CX, AX
  3138.                 JCXZ    FCBBlkWrite_8F
  3139. FCBBlkWrite_8D:
  3140.                 Inc     Byte Ptr ES:[DI+32]
  3141.                 Cmp     Byte Ptr ES:[DI+32], 128
  3142.                 JB      FCBBlkWrite_8E
  3143.  
  3144.                 Mov     Byte Ptr ES:[DI+32], 0
  3145.                 Inc     Word Ptr ES:[DI+12]
  3146. FCBBlkWrite_8E:
  3147.                 Loop    FCBBlkWrite_8D
  3148.  
  3149. FCBBlkWrite_8F:
  3150.                 CLI                     ; restore user's stack
  3151.                 Mov     SS, CS:OldSS
  3152.                 Mov     SP, CS:OldSP
  3153.                 STI
  3154.  
  3155.                 Pop     DS              ; request satisfied....
  3156.                 Pop     ES              ; go back to the application
  3157.                 Pop     BP
  3158.                 Pop     DI
  3159.                 Pop     SI
  3160.                 Pop     DX
  3161.                 Pop     CX
  3162.                 Pop     BX
  3163.                 Pop     AX
  3164.                 Mov     AX, CS:R_AX
  3165.                 Mov     CX, CS:R_CX
  3166.  
  3167.                 Jmp     ExitDOS
  3168.  
  3169.  
  3170.  
  3171. DoFCBBlkWrite_9:
  3172.                 CLI                     ; restore user's stack
  3173.                 Mov     SS, CS:OldSS
  3174.                 Mov     SP, CS:OldSP
  3175.                 STI
  3176.  
  3177.                 Pop     DS
  3178.                 Pop     ES
  3179.                 Pop     BP
  3180.                 Pop     DI
  3181.                 Pop     SI
  3182.                 Pop     DX
  3183.                 Pop     CX
  3184.                 Pop     BX
  3185.                 Pop     AX
  3186.  
  3187.                 Jmp     DefaultDOS
  3188.  
  3189.  
  3190.  
  3191. ;-----------------------------------------------------------------;
  3192. ;                                                                 ;
  3193. ;       Exit back to application, leaving flags/registers         ;
  3194. ;       in proper state.                                          ;
  3195. ;                                                                 ;
  3196. ;-----------------------------------------------------------------;
  3197.  
  3198. ExitDOS:
  3199.                 Cmp     CS:IOFlag, 0
  3200.                 JNE     ErrorEncountered
  3201.                 PopF                    ; discard flags
  3202.                 STI
  3203.                 CLC                     ; indicate success
  3204.                 Ret     2
  3205.  
  3206.  
  3207. ErrorEncountered:
  3208.                 Mov     AX, 5
  3209.  
  3210. BadDOS:
  3211.                 PopF                    ; discard flags
  3212.                 STI
  3213.                 STC                     ; indicate failure
  3214.                 Ret     2
  3215.  
  3216.  
  3217. DOS_Handler     EndP
  3218.  
  3219.  
  3220. ;-----------------------------------------------------------------;
  3221. ;       Check the result of our I/O efforts.                      ;
  3222. ;-----------------------------------------------------------------;
  3223.  
  3224. CheckReadError  Proc    Near
  3225.                 JC      SayReadError
  3226.                 Cmp     AX, CX
  3227.                 JNE     SayReadError
  3228.                 Jmp     ChkReadExit
  3229.  
  3230. SayReadError:
  3231.                 Cmp     CS:IOFlag, 0
  3232.                 JNE     ChkReadExit
  3233.  
  3234.                 Push    AX
  3235.                 Push    BX
  3236.                 Push    CX
  3237.                 Push    DX
  3238.                 Push    SI
  3239.                 Push    DI
  3240.                 Push    ES
  3241.  
  3242.                 Call    SaveLine25
  3243.                 Push    CS
  3244.                 Pop     ES
  3245.                 Mov     IOFlag, 1
  3246.  
  3247.                 Mov     DX, 1800h
  3248.                 Mov     DI, Offset ReadErrorMessage
  3249.                 Mov     CX, LReadError
  3250.                 Call    AttrCharOut
  3251.  
  3252. ReadErrorWait:  Mov     AH, 0
  3253.                 Int     16h
  3254.                 Cmp     AL, 0Dh
  3255.                 JNE     ReadErrorWait
  3256.                 Call    RestLine25
  3257.  
  3258.                 Pop     ES
  3259.                 Pop     DI
  3260.                 Pop     SI
  3261.                 Pop     DX
  3262.                 Pop     CX
  3263.                 Pop     BX
  3264.                 Pop     AX
  3265.  
  3266. ChkReadExit:    Ret
  3267. CheckReadError  EndP
  3268.  
  3269. ;-----------------------------------------------------------------;
  3270.  
  3271. CheckWriteError Proc    Near
  3272.                 JC      SayWriteError
  3273.                 Cmp     AX, CX
  3274.                 JNE     SayWriteError
  3275.                 Jmp     ChkWriteExit
  3276.  
  3277. SayWriteError:
  3278.                 Cmp     CS:IOFlag, 0
  3279.                 JNE     ChkWriteExit
  3280.  
  3281.                 Push    AX
  3282.                 Push    BX
  3283.                 Push    CX
  3284.                 Push    DX
  3285.                 Push    SI
  3286.                 Push    DI
  3287.                 Push    ES
  3288.  
  3289.                 Call    SaveLine25
  3290.                 Push    CS
  3291.                 Pop     ES
  3292.                 Mov     IOFlag, 1
  3293.  
  3294.                 Mov     DX, 1800h
  3295.                 Mov     DI, Offset WriteErrorMessage
  3296.                 Mov     CX, LWriteError
  3297.                 Call    AttrCharOut
  3298.  
  3299. WriteErrorWait: Mov     AH, 0
  3300.                 Int     16h
  3301.                 Cmp     AL, 0Dh
  3302.                 JNE     WriteErrorWait
  3303.                 Call    RestLine25
  3304.  
  3305.                 Pop     ES
  3306.                 Pop     DI
  3307.                 Pop     SI
  3308.                 Pop     DX
  3309.                 Pop     CX
  3310.                 Pop     BX
  3311.                 Pop     AX
  3312.  
  3313. ChkWriteExit:    Ret
  3314. CheckWriteError  EndP
  3315.  
  3316. ;-----------------------------------------------------------------;
  3317.  
  3318. TooManyCheck    Proc    Near
  3319.                 Cmp     FileCount, 10
  3320.                 JBE     TooManyExit
  3321.  
  3322.                 Push    AX
  3323.                 Push    BX
  3324.                 Push    CX
  3325.                 Push    DX
  3326.                 Push    SI
  3327.                 Push    DI
  3328.                 Push    ES
  3329.  
  3330.                 Call    SaveLine25
  3331.                 Push    CS
  3332.                 Pop     ES
  3333.                 Mov     IOFlag, 1
  3334.  
  3335.                 Mov     DX, 1800h
  3336.                 Mov     DI, Offset TooManyError
  3337.                 Mov     CX, LTooManyError
  3338.                 Call    AttrCharOut
  3339.  
  3340. TooManyWait:    Mov     AH, 0
  3341.                 Int     16h
  3342.                 Cmp     AL, 0Dh
  3343.                 JNE     TooManyWait
  3344.                 Call    RestLine25
  3345.  
  3346.                 Pop     ES
  3347.                 Pop     DI
  3348.                 Pop     SI
  3349.                 Pop     DX
  3350.                 Pop     CX
  3351.                 Pop     BX
  3352.                 Pop     AX
  3353.  
  3354.                 STC
  3355.                 Ret
  3356.  
  3357.  
  3358. TooManyExit:    CLC
  3359.                 Ret
  3360. TooManyCheck    EndP
  3361.  
  3362.  
  3363.  
  3364. ;-----------------------------------------------------------------;
  3365. ;       Parse FCB name into NameBuffer, and put                   ;
  3366. ;       length into CreateLength field.                           ;
  3367. ;-----------------------------------------------------------------;
  3368.  
  3369. ParseFCBName    Proc    Near
  3370.  
  3371.                 Mov     CreateLength, 0
  3372.                 Mov     SI, Offset NameBuffer
  3373.                 LES     DI, FCBPtr
  3374.                 Cmp     Byte Ptr ES:[DI], 0FFh
  3375.                 JNE     FCBParse_NotExt
  3376.                 Add     DI, 7
  3377.  
  3378. FCBParse_NotExt:
  3379.                 Mov     AL, Byte Ptr ES:[DI]
  3380.                 Inc     DI
  3381.                 Cmp     AL, 0
  3382.                 JE      FCBParseNoDrive
  3383.  
  3384.                 Add     AL, "A" - 1
  3385.  
  3386. FCBParseDrivePart:
  3387.                 Mov     Byte Ptr [SI], AL
  3388.                 Inc     CreateLength
  3389.                 Inc     SI
  3390.                 Mov     Byte Ptr [SI], ":"
  3391.                 Inc     CreateLength
  3392.                 Inc     SI
  3393.                 Jmp     FCBParseNamePart
  3394.  
  3395. FCBParseNoDrive:
  3396.                 CallDOS CurrentDiskOp
  3397.                 Add     AL, "A"
  3398.                 Jmp     FCBParseDrivePart
  3399.  
  3400. FCBParseNamePart:
  3401.                 Mov     CX, 8
  3402.                 Push    DI
  3403.  
  3404. FCBParseNxtNameChar:
  3405.                 Mov     AL, Byte Ptr ES:[DI]
  3406.                 Cmp     AL, " "
  3407.                 JE      FCBParseGetExt
  3408.                 Mov     Byte Ptr [SI], AL
  3409.                 Inc     CreateLength
  3410.                 Inc     DI
  3411.                 Inc     SI
  3412.                 Loop    FCBParseNxtNameChar
  3413.  
  3414. FCBParseGetExt:
  3415.                 Pop     DI
  3416.                 Add     DI, 8
  3417.                 Mov     AL, Byte Ptr ES:[DI]
  3418.                 Cmp     AL, " "
  3419.                 JE      FCBParseGotName
  3420.                 Mov     Byte Ptr [SI], "."
  3421.                 Inc     CreateLength
  3422.                 Inc     SI
  3423.                 Mov     Byte Ptr [SI], AL
  3424.                 Inc     CreateLength
  3425.                 Inc     DI
  3426.                 Inc     SI
  3427.                 Mov     AL, Byte Ptr ES:[DI]
  3428.                 Cmp     AL, " "
  3429.                 JE      FCBParseGotName
  3430.                 Mov     Byte Ptr [SI], AL
  3431.                 Inc     CreateLength
  3432.                 Inc     DI
  3433.                 Inc     SI
  3434.                 Mov     AL, Byte Ptr ES:[DI]
  3435.                 Cmp     AL, " "
  3436.                 JE      FCBParseGotName
  3437.                 Mov     Byte Ptr [SI], AL
  3438.                 Inc     CreateLength
  3439.                 Inc     SI
  3440.  
  3441. FCBParseGotName:
  3442.                 Mov     Byte Ptr [SI], 0
  3443.                 Push    DS
  3444.                 Pop     ES
  3445.  
  3446.                 Ret
  3447. ParseFCBName    EndP
  3448.  
  3449.  
  3450. ;-----------------------------------------------------------------;
  3451. ;       Get CX bytes into buffer pointed to by DS:DX              ;
  3452. ;-----------------------------------------------------------------;
  3453.  
  3454. Get_CX_Bytes_To_DSDX Proc       Near
  3455. ;
  3456. ; See if DeComp-Buffer is for this file/PID and file position
  3457. ;
  3458.                 Push    DS
  3459.                 Pop     ES
  3460.                 Push    R_CX
  3461.  
  3462.                 Mov     BytesMoved, 0
  3463.  
  3464. DoRead_1A:
  3465.                 Mov     DI, TablePtr
  3466.                 Shl     DI, 1
  3467.                 Mov     AX, Word Ptr FilePosTbl [DI]
  3468.                 Mov     DX, Word Ptr FilePosTbl [DI+2]
  3469.                 Mov     Word Ptr CurrFilePos, AX
  3470.                 Mov     Word Ptr CurrFilePos+2, DX
  3471.  
  3472. ; Don't go beyond EOF, no matter what the requested bytecount is
  3473.  
  3474.                 Push    AX
  3475.                 Mov     AX, CurrHandle
  3476.                 Mov     GetCtrlHandle, AX
  3477.                 Mov     AX, OldPID
  3478.                 Mov     GetCtrlPID, AX
  3479.                 Call    GetControlRec
  3480.                 Pop     AX
  3481.                 Mov     CX, Word Ptr Ctrl_FileLen
  3482.                 Mov     BX, Word Ptr Ctrl_FileLen+2
  3483.  
  3484.                 Cmp     DX, BX
  3485.                 JA      DoRead_1B
  3486.                 JB      DoRead_1C
  3487.                 Cmp     AX, CX
  3488.                 JB      DoRead_1C
  3489.  
  3490. DoRead_1B:      Mov     R_CX, 0
  3491.                 Jmp     DoRead_6
  3492.  
  3493. DoRead_1C:      Sub     CX, AX
  3494.                 Sbb     BX, DX
  3495.  
  3496.                 Or      BX, BX
  3497.                 JNZ     DoRead_1_Continue
  3498.                 Cmp     CX, R_CX
  3499.                 JAE     DoRead_1_Continue
  3500.  
  3501.                 Mov     R_CX, CX
  3502.  
  3503. DoRead_1_Continue:
  3504.                 Cmp     R_CX, 0
  3505.                 JNE     DoRead_1D
  3506.                 Jmp     DoRead_6
  3507.  
  3508. DoRead_1D:      Mov     BX, MaxBuf
  3509.                 Div     BX
  3510.                 Mov     CurrBlock, AX
  3511.                 Mov     BlockPos, DX
  3512.  
  3513.                 Cmp     AX, DeCompBlock
  3514.                 JNE     DoRead_2
  3515.  
  3516.                 Mov     AX, OldPID
  3517.                 Cmp     AX, DeCompPID
  3518.                 JNE     DoRead_2
  3519.  
  3520.                 Mov     AX, CurrHandle
  3521.                 Cmp     AX, DeCompHandle
  3522.                 JNE     DoRead_2
  3523.  
  3524.                 Jmp     DoRead_3                ; use DeComp Buffer
  3525.  
  3526. ;
  3527. ; Read appropriate skinny block and de-compress it.
  3528. ;
  3529. DoRead_2:
  3530.                 Call    GetBlock
  3531.                 JNC     DoRead_3
  3532.  
  3533.                 Jmp     DoRead_6
  3534.  
  3535. ;
  3536. ; Transfer decompressed material into application buffer
  3537. ; (starting at file pos) until either
  3538. ;       - request is satisfied, or
  3539. ;       - end of block is encountered.
  3540. ;
  3541.  
  3542. DoRead_3:
  3543.                 Mov     EndOfBlock, 0   ; default to "we have it all"
  3544.                 Mov     CX, R_CX        ; set up # bytes to move
  3545.  
  3546.                 Mov     AX, MaxBuf
  3547.                 Sub     AX, BlockPos    ; calc # chars left in buffer
  3548.                 Cmp     AX, CX          ; is it enough?
  3549.                 JAE     DoRead_3A       ; yes
  3550.  
  3551.                 Mov     CX, AX          ; only move what we have
  3552.                 Mov     EndOfBlock, 1   ; signal we'll need next block
  3553.  
  3554. DoRead_3A:
  3555.                 Push    CX
  3556.                 Mov     SI, Offset DeCompBuffer
  3557.                 Add     SI, BlockPos
  3558.                 LES     DI, ApplBufferPtr
  3559.         Rep     MovSB
  3560.                 Mov     R_DX, DI
  3561.                 Pop     CX
  3562.  
  3563.                 Push    DS
  3564.                 Pop     ES
  3565.  
  3566. ;
  3567. ; if we encountered end-of-block before, go back to finish the job.
  3568. ;
  3569. DoRead_4:
  3570.                 Add     BytesMoved, CX          ; what we've done so far
  3571.                 Sub     R_CX, CX                ; remainder to move
  3572.  
  3573.                 Cmp     EndOfBlock, 1           ; need to get next block?
  3574.                 JNE     DoRead_6                ; no
  3575.  
  3576.                 Mov     BlockPos, 0
  3577.                 Inc     CurrBlock
  3578.                 Jmp     DoRead_2
  3579.  
  3580. ;
  3581. ; update file-position information
  3582. ;
  3583. DoRead_6:
  3584.                 Mov     CX, BytesMoved
  3585.                 Add     Word Ptr CurrFilePos, CX
  3586.                 Adc     Word Ptr CurrFilePos+2, 0
  3587.  
  3588.                 Mov     SI, TablePtr
  3589.                 Shl     SI, 1
  3590.                 Mov     AX, Word Ptr CurrFilePos
  3591.                 Mov     DX, Word Ptr CurrFilePos+2
  3592.                 Mov     Word Ptr FilePosTbl [SI], AX
  3593.                 Mov     Word Ptr FilePosTbl [SI+2], DX
  3594.  
  3595.                 Pop     R_CX
  3596.                 Ret
  3597. Get_CX_Bytes_To_DSDX EndP
  3598.  
  3599.  
  3600. ;-----------------------------------------------------------------;
  3601. ;       Put CX bytes from DS:DX buffer to disk                    ;
  3602. ;-----------------------------------------------------------------;
  3603.  
  3604. Put_CX_Bytes_From_DSDX Proc     Near
  3605.                 Push    DS
  3606.                 Pop     ES
  3607.                 Push    R_CX
  3608.  
  3609.                 Mov     BytesMoved, 0
  3610.  
  3611.                 Mov     DI, TablePtr
  3612.                 Shl     DI, 1
  3613.                 Mov     AX, Word Ptr FilePosTbl [DI]
  3614.                 Mov     DX, Word Ptr FilePosTbl [DI+2]
  3615.                 Mov     Word Ptr CurrFilePos, AX
  3616.                 Mov     Word Ptr CurrFilePos+2, DX
  3617.  
  3618.                 Mov     BX, MaxBuf
  3619.                 Div     BX
  3620.                 Mov     CurrBlock, AX
  3621.                 Mov     BlockPos, DX
  3622.  
  3623.                 Cmp     AX, DeCompBlock
  3624.                 JNE     DoWrite_2
  3625.  
  3626.                 Mov     AX, OldPID
  3627.                 Cmp     AX, DeCompPID
  3628.                 JNE     DoWrite_2
  3629.  
  3630.                 Mov     AX, CurrHandle
  3631.                 Cmp     AX, DeCompHandle
  3632.                 JNE     DoWrite_2
  3633.  
  3634.                 Jmp     DoWrite_4                ; use DeComp Buffer
  3635.  
  3636. ;
  3637. ; is current file position anywhere inside the file already?
  3638. ;
  3639.  
  3640. DoWrite_2:
  3641.                 Call    GetBlock
  3642.                 JNC     DoWrite_4
  3643.  
  3644. ;
  3645. ; fill decomp buffer with nulls
  3646. ;
  3647.  
  3648. DoWrite_3:
  3649.                 Mov     DI, Offset DeCompBuffer
  3650.                 Mov     AX, 0
  3651.                 Mov     CX, (MaxBuf/2)
  3652.         Rep     StoSW
  3653.  
  3654. ;
  3655. ; merge material to be written into DeComp Buffer
  3656. ;
  3657.  
  3658. DoWrite_4:
  3659.                 Mov     EndOfBlock, 0           ; default to "it fits"
  3660.                 Mov     CX, R_CX                ; # bytes to write
  3661.  
  3662.                 Mov     AX, MaxBuf
  3663.                 Sub     AX, BlockPos            ; bufsize - current position
  3664.                 Cmp     AX, CX                  ; # chars left in buffer
  3665.                 JAE     DoWrite_4A              ; buffer is large enough
  3666.  
  3667.                 Mov     CX, AX                  ; only move what we can
  3668.                 Mov     EndOfBlock, 1           ; signal "we'll need next block"
  3669.  
  3670. DoWrite_4A:
  3671.                 Cmp     R_CX, 0
  3672.                 JE      DoWriteTruncate
  3673.  
  3674.                 Mov     DeCompDirty, 1
  3675.                 Push    CX
  3676.                 Mov     DI, Offset DeCompBuffer
  3677.                 Add     DI, BlockPos
  3678.                 LDS     SI, ApplBufferPtr
  3679.         Rep     MovSB
  3680.                 Pop     CX
  3681.  
  3682.                 Push    ES
  3683.                 Pop     DS
  3684.                 Mov     R_DX, SI
  3685.  
  3686. ;
  3687. ; update the stats.  do we need another block?
  3688. ;
  3689.  
  3690. DoWrite_5:
  3691.                 Add     BytesMoved, CX
  3692.                 Sub     R_CX, CX                ; keep track of partial blks
  3693.  
  3694.                 Cmp     EndOfBlock, 1           ; need to continue into nxt blk?
  3695.                 JNE     DoWrite_6               ; no
  3696.  
  3697.                 Mov     BlockPos, 0
  3698.                 Inc     CurrBlock
  3699.  
  3700.                 Jmp     DoWrite_2
  3701.  
  3702.  
  3703. DoWriteTruncate:
  3704.                 Cmp     Word Ptr CurrFilePos, 0
  3705.                 JNE     DoWriteTrunc2
  3706.                 Cmp     Word Ptr CurrFilePos+2, 0
  3707.                 JNE     DoWriteTrunc2
  3708.  
  3709.                 Call    WriteInitControl
  3710.                 Jmp     DoWrite_6
  3711.  
  3712. DoWriteTrunc2:
  3713.                 Mov     CX, MaxBuf
  3714.                 Sub     CX, BlockPos
  3715.                 Mov     DI, Offset DeCompBuffer
  3716.                 Add     DI, BlockPos
  3717.                 Xor     AX, AX
  3718.         Rep     StoSB
  3719.                 Mov     DeCompDirty, 1
  3720.  
  3721.                 Mov     DI, Offset Loc_Len_Info
  3722.                 Mov     AX, 6
  3723.                 Mov     CX, CurrBlock
  3724.                 Sub     CX, PointersStart
  3725.                 Inc     CX
  3726.                 Mul     CX
  3727.                 Add     DI, AX
  3728.                 Mov     AL, 0FFh
  3729.                 Mov     CX, Offset EndOfCtrlRec
  3730.                 Sub     CX, DI
  3731.         Rep     StoSB
  3732.                 Mov     PtrsDirty, 1
  3733.  
  3734.                 Mov     AX, Word Ptr CurrFilePos
  3735.                 Mov     DX, Word Ptr CurrFilePos+2
  3736.  
  3737.                 Jmp     DoWrite_7
  3738.  
  3739. ;
  3740. ; update file-position information
  3741. ;
  3742. DoWrite_6:
  3743.                 Mov     CX, BytesMoved
  3744.                 Add     Word Ptr CurrFilePos, CX
  3745.                 Adc     Word Ptr CurrFilePos+2, 0
  3746.  
  3747.                 Mov     SI, TablePtr
  3748.                 Shl     SI, 1
  3749.                 Mov     AX, Word Ptr CurrFilePos
  3750.                 Mov     DX, Word Ptr CurrFilePos+2
  3751.                 Mov     Word Ptr FilePosTbl [SI], AX
  3752.                 Mov     Word Ptr FilePosTbl [SI+2], DX
  3753.  
  3754.                 Call    AlignDupedFiles
  3755.  
  3756.                 Cmp     DX, Word Ptr Ctrl_FileLen+2
  3757.                 JB      DoWrite_8
  3758.                 JA      DoWrite_7
  3759.                 Cmp     AX, Word Ptr Ctrl_FileLen
  3760.                 JBE     DoWrite_8
  3761.  
  3762. DoWrite_7:
  3763.                 Mov     Word Ptr Ctrl_FileLen, AX    ; new "virtual"
  3764.                 Mov     Word Ptr Ctrl_FileLen+2, DX  ; file length
  3765.                 Mov     CtrlDirty, 1
  3766.  
  3767. DoWrite_8:
  3768.                 Pop     R_CX
  3769.                 Ret
  3770. Put_CX_Bytes_From_DSDX EndP
  3771.  
  3772.  
  3773. ;-----------------------------------------------------------------;
  3774. ;       See if FCB name is in FCBTable                            ;
  3775. ;-----------------------------------------------------------------;
  3776.  
  3777. SearchFCBTable  Proc    Near
  3778.                 LES     DI, FCBPtr
  3779.                 Cmp     Byte Ptr ES:[DI], 0FFh
  3780.                 JNE     SearchFCB_1
  3781.                 Add     DI, 7
  3782. SearchFCB_1:
  3783.                 Mov     SI, Offset FCBTable
  3784.                 Mov     AX, 0
  3785.  
  3786. FCBNextNmEntry:
  3787.                 Push    SI
  3788.                 Push    DI
  3789.                 Mov     CX, 6
  3790.         RepE    CmpSW
  3791.                 Pop     DI
  3792.                 Pop     SI
  3793.                 JNE     BumpToNextFCBName
  3794.  
  3795.                 Push    DS
  3796.                 Pop     ES
  3797.                 Mov     FCBTablePtr, SI
  3798.                 Shl     AX, 1
  3799.                 Mov     TablePtr, AX
  3800.                 CLC
  3801.                 Ret
  3802.  
  3803. BumpToNextFCBName:
  3804.                 Add     SI, 12
  3805.                 Inc     AX
  3806.                 Cmp     AX, MaxHandles
  3807.                 JB      FCBNextNmEntry
  3808.  
  3809.                 Push    DS
  3810.                 Pop     ES
  3811.                 STC
  3812.                 Ret
  3813. SearchFCBTable  EndP
  3814.  
  3815.  
  3816. ;-----------------------------------------------------------------;
  3817. ;       Put message pointed to by ES:DI out to the screen         ;
  3818. ;       on line 25.  Use an attribute of black-on-white.          ;
  3819. ;       Length of message is in CX.  Row/Col in DX.               ;
  3820. ;-----------------------------------------------------------------;
  3821.  
  3822. AttrCharOut     Proc    Near
  3823. ACO_Next:       JCXZ    ACO_Exit
  3824.                 Mov     AH, 2
  3825.                 Mov     BH, 0
  3826.                 Int     10h
  3827.  
  3828.                 Mov     AL, Byte Ptr ES:[DI]
  3829.                 Push    CX
  3830.                 Mov     AH, 9
  3831.                 Mov     BX, 0070h
  3832.                 Mov     CX, 1
  3833.                 Int     10h
  3834.                 Pop     CX
  3835.  
  3836.                 Dec     CX
  3837.                 Inc     DI
  3838.                 Inc     DL
  3839.                 Jmp     ACO_Next
  3840.  
  3841. ACO_Exit:       Ret
  3842. AttrCharOut     EndP
  3843.  
  3844.  
  3845. ;-----------------------------------------------------------------;
  3846. ;       Save any text on screen line 25.                          ;
  3847. ;-----------------------------------------------------------------;
  3848.  
  3849. SaveLine25      Proc    Near
  3850.                 Mov     AH, 3
  3851.                 Mov     BH, 0
  3852.                 Int     10h
  3853.                 Mov     CPosSave, DX
  3854.                 Mov     CTypSave, CX
  3855.  
  3856.                 Mov     SI, 0
  3857.                 Mov     DX, 1800h
  3858.  
  3859. GetFromScrn:
  3860.                 Push    SI
  3861.                 Mov     AH, 2
  3862.                 Mov     BH, 0
  3863.                 Int     10h
  3864.                 Mov     AH, 8
  3865.                 Mov     BH, 0
  3866.                 Int     10h
  3867.                 Pop     SI
  3868.                 Mov     Word Ptr ScreenSave [SI], AX
  3869.                 Inc     DX
  3870.                 Inc     SI
  3871.                 Inc     SI
  3872.                 Cmp     DX, 184Fh
  3873.                 JNE     GetFromScrn
  3874.  
  3875.                 Ret
  3876. SaveLine25      EndP
  3877.  
  3878.  
  3879.  
  3880.  
  3881. ;-----------------------------------------------------------------;
  3882. ;       Restore text on screen line 25.                           ;
  3883. ;-----------------------------------------------------------------;
  3884.  
  3885. RestLine25      Proc    Near
  3886.                 Mov     SI, 0
  3887.                 Mov     DX, 1800h
  3888.  
  3889. PutToScrn:
  3890.                 Push    SI
  3891.                 Mov     AH, 2
  3892.                 Mov     BH, 0
  3893.                 Int     10h
  3894.                 Pop     SI
  3895.  
  3896.                 Mov     AX, Word Ptr ScreenSave [SI]
  3897.                 Push    SI
  3898.                 Mov     BL, AH
  3899.                 Mov     BH, 0
  3900.                 Mov     CX, 1
  3901.                 Mov     AH, 9
  3902.                 Int     10h
  3903.                 Pop     SI
  3904.                 Inc     DX
  3905.                 Inc     SI
  3906.                 Inc     SI
  3907.                 Cmp     DX, 184Fh
  3908.                 JNE     PutToScrn
  3909.  
  3910.                 Mov     AH, 1
  3911.                 Mov     CX, CTypSave
  3912.                 Int     10h
  3913.                 Mov     DX, CPosSave
  3914.                 Mov     BH, 0
  3915.                 Mov     AH, 2
  3916.                 Int     10h
  3917.  
  3918.                 Ret
  3919. RestLine25      EndP
  3920.  
  3921. ;-----------------------------------------------------------------;
  3922. ;                                                                 ;
  3923. ;       Get a block of skinny material & decompress it            ;
  3924. ;                                                                 ;
  3925. ;-----------------------------------------------------------------;
  3926.  
  3927. GetBlock        Proc    Near
  3928.                 Call    PutBlock
  3929.  
  3930.                 Mov     AdvancePtr, 0
  3931.                 Mov     AX, CurrBlock
  3932.                 Mov     DeCompBlock, AX
  3933.                 Mov     AX, OldPID
  3934.                 Mov     DeCompPID, AX
  3935.                 Mov     AX, CurrHandle
  3936.                 Mov     DeCompHandle, AX
  3937.  
  3938.                 Mov     AX, CurrHandle
  3939.                 Mov     GetCtrlHandle, AX
  3940.                 Mov     GetPtrsHandle, AX
  3941.                 Mov     AX, OldPID
  3942.                 Mov     GetCtrlPID, AX
  3943.                 Mov     GetPtrsPID, AX
  3944.                 Call    GetControlRec           ; for filelength
  3945.  
  3946.                 Mov     AX, CurrBlock
  3947.                 Mov     PointerBlock, AX
  3948.                 Call    GetPointerRec           ; based on CurrBlock
  3949.  
  3950. GetBlock_1:
  3951.                 Mov     BX, Offset Loc_Len_Info ; get block position
  3952.                 Mov     AX, 6
  3953.                 Mov     SI, CurrBlock
  3954.                 Sub     SI, PointersStart
  3955.                 Mul     SI
  3956.                 Add     BX, AX
  3957.  
  3958.                 Mov     DX, Word Ptr [BX]       ; location low word
  3959.                 Mov     CX, Word Ptr [BX+2]     ; location high word
  3960.                 Mov     SI, Word Ptr [BX+4]     ; length
  3961.  
  3962.                 Cmp     SI, 0FFFFh              ; valid entry?
  3963.                 JNE     GetBlock_2              ; yes
  3964.  
  3965. BlockNotFound:
  3966.                 STC
  3967.                 Ret
  3968.  
  3969. ; - - - - - - - - - - - - - - - - - - - - - - - -
  3970. GetBlock_2:
  3971.                 Mov     AX, 0
  3972.                 Mov     BX, CurrHandle
  3973.                 CallDOS SeekOp                  ; seek to skinny block
  3974.  
  3975.                 Mov     CX, SI                  ; remember length
  3976.                 Mov     BX, CurrHandle          ; read skinny block
  3977.                 Mov     DX, Offset DeCompBuffer
  3978.                 CallDOS ReadOp
  3979.                 Call    CheckReadError
  3980.  
  3981.                 Mov     DI, Offset IOBuffer
  3982.                 Add     DI, AdvancePtr
  3983.                 Mov     SI, Offset DeCompBuffer+6
  3984.                 Sub     CX, 6
  3985.                 Add     AdvancePtr, CX
  3986.         Rep     MovSB
  3987.  
  3988. ;
  3989. ; now get any "extents" that belong to this compressed material
  3990. ;
  3991.  
  3992. LookAtLink:
  3993.                 Cmp     ILinkLen, 0FFFFh        ; last in chain?
  3994.                 JE      DeCompressThisBlock     ; yes
  3995.  
  3996.                 Mov     CX, Word Ptr ILinkPtr+2
  3997.                 Mov     DX, Word Ptr ILinkPtr
  3998.                 Mov     SI, ILinkLen
  3999.  
  4000.                 Jmp     GetBlock_2
  4001.  
  4002. DecompressThisBlock:
  4003.                 Mov     Prefix_Code, 0
  4004.                 Mov     Free_Code, First_Free
  4005.                 Mov     Max_Code, K512
  4006.                 Mov     NBits, K9
  4007.                 Mov     K, 0
  4008.                 Mov     Bit_Offset, 0
  4009.                 Mov     Input_Offset, 0
  4010.                 Mov     Input_Size, MaxBuf
  4011.                 Mov     Cur_Code, 0
  4012.                 Mov     Old_Code, 0
  4013.                 Mov     In_Code, 0
  4014.                 Mov     Stack_Count, 0
  4015.                 Mov     Fin_Char, 0
  4016.                 Mov     Output_Offset, 0
  4017.  
  4018.                 Mov     DI, Offset Hash
  4019.                 Mov     CX, (maxmax * 5) / 2
  4020.                 Xor     AX, AX
  4021.         Rep     StoSW
  4022.  
  4023.                 Call    DeCompress              ; IOBuffer --> DeCompBuffer
  4024.  
  4025.                 CLC
  4026.                 Ret
  4027. GetBlock        EndP
  4028.  
  4029.  
  4030. ;-----------------------------------------------------------------;
  4031. ;       Compress DeCompBuffer into IOBuffer and write             ;
  4032. ;       IOBuffer out to disk.                                     ;
  4033. ;-----------------------------------------------------------------;
  4034.  
  4035. PutBlock        Proc    Near
  4036.                 Cmp     DeCompDirty, 1
  4037.                 JE      DoWriteTheBlock
  4038.  
  4039.                 Ret
  4040.  
  4041. DoWriteTheBlock:
  4042.                 Mov     Prefix_Code, 0
  4043.                 Mov     Free_Code, 0
  4044.                 Mov     Max_Code, K512
  4045.                 Mov     NBits, K9
  4046.                 Mov     K, 0
  4047.                 Mov     Bit_Offset, 0
  4048.                 Mov     Input_Offset, 0
  4049.                 Mov     Input_Size, MaxBuf
  4050.                 Mov     Cur_Code, 0
  4051.                 Mov     Old_Code, 0
  4052.                 Mov     In_Code, 0
  4053.                 Mov     Stack_Count, 0
  4054.                 Mov     Fin_Char, 0
  4055.                 Mov     Output_Offset, 0
  4056.  
  4057.                 Mov     DI, Offset Hash
  4058.                 Mov     CX, (maxmax * 5) / 2
  4059.                 Xor     AX, AX
  4060.         Rep     StoSW
  4061.  
  4062.                 Call    Compress                ; DeCompBuf --> IOBuf+6
  4063.  
  4064.                 Mov     AX, DeCompHandle
  4065.                 Mov     GetCtrlHandle, AX
  4066.                 Mov     GetPtrsHandle, AX
  4067.                 Mov     AX, DeCompPID
  4068.                 Mov     GetCtrlPID, AX
  4069.                 Mov     GetPtrsPID, AX
  4070.                 Call    GetControlRec
  4071.  
  4072.                 Mov     AX, DeCompBlock
  4073.                 Mov     PointerBlock, AX
  4074.                 Call    GetPointerRec
  4075.  
  4076.                 Mov     BX, Offset Loc_Len_Info ; get block position
  4077.                 Mov     AX, 6
  4078.                 Mov     SI, DeCompBlock
  4079.                 Sub     SI, PointersStart
  4080.                 Mul     SI
  4081.                 Add     BX, AX
  4082.                 Mov     PtrRecSegment, BX
  4083.  
  4084.                 Mov     DX, Word Ptr [BX]       ; location low word
  4085.                 Mov     CX, Word Ptr [BX+2]     ; location high word
  4086.                 Mov     SI, Word Ptr [BX+4]     ; length
  4087.  
  4088.                 Mov     Word Ptr CurrPtr, DX
  4089.                 Mov     Word Ptr CurrPtr+2, CX
  4090.                 Mov     CurrLen, SI
  4091.  
  4092.                 Mov     AX, Offset IOBuffer+6
  4093.                 Mov     AdvancePtr, AX
  4094.                 Mov     AX, CompressLength
  4095.                 Mov     LenToWrite, AX
  4096.  
  4097. PutBlock_1:
  4098.                 Cmp     LenToWrite, 0
  4099.                 JNE     PutBlock_2
  4100.  
  4101. PutBlockExit:
  4102.                 Mov     DeCompDirty, 0
  4103.                 Ret
  4104.  
  4105.  
  4106. PutBlock_2:     Cmp     Word Ptr CurrPtr+2, 0FFFFh
  4107.                 JE      PutBlock_3
  4108.  
  4109.                 Sub     CurrLen, 6
  4110.  
  4111.                 Mov     DX, Word Ptr CurrPtr
  4112.                 Mov     CX, Word Ptr CurrPtr+2
  4113.                 Mov     BX, DeCompHandle
  4114.                 Mov     AL, 0
  4115.                 CallDOS SeekOp
  4116.  
  4117.                 Mov     BX, DeCompHandle
  4118.                 Mov     CX, 6
  4119.                 Mov     DX, Offset IOBuffer
  4120.                 CallDOS ReadOp
  4121.                 Call    CheckReadError
  4122.  
  4123.                 Mov     AX, Word Ptr OLinkPtr
  4124.                 Mov     Word Ptr NextPtr, AX
  4125.                 Mov     AX, Word Ptr OLinkPtr+2
  4126.                 Mov     Word Ptr NextPtr+2, AX
  4127.                 Mov     AX, OLinkLen
  4128.                 Mov     NextLen, AX
  4129.  
  4130.                 Jmp     PutBlock_4
  4131.  
  4132. PutBlock_3:
  4133.                 Mov     CX, 0
  4134.                 Mov     DX, CX
  4135.                 Mov     AL, 2
  4136.                 Mov     BX, DeCompHandle
  4137.                 CallDOS SeekOp
  4138.  
  4139.                 Mov     CX, DX
  4140.                 Mov     DX, AX
  4141.                 Mov     Word Ptr CurrPtr, DX
  4142.                 Mov     Word Ptr CurrPtr+2, CX
  4143.                 Mov     AX, LenToWrite
  4144.                 Mov     CurrLen, AX
  4145.  
  4146.                 Mov     BX, PtrRecSegment
  4147.                 Cmp     Word Ptr [BX+2], 0FFFFh
  4148.                 JNE     PutBlock_3A
  4149.  
  4150.                 Mov     Word Ptr [BX], DX
  4151.                 Mov     Word Ptr [BX+2], CX
  4152.                 Add     AX, 6
  4153.                 Mov     Word Ptr [BX+4], AX
  4154.                 Mov     PtrsDirty, 1
  4155.                 Jmp     PutBlock_3B
  4156.  
  4157. PutBlock_3A:
  4158.                 Mov     DX, Word Ptr PrevPtr
  4159.                 Mov     CX, Word Ptr PrevPtr+2
  4160.                 Mov     BX, DeCompHandle
  4161.                 Mov     AL, 0
  4162.                 CallDOS SeekOp
  4163.  
  4164.                 Mov     AX, Word Ptr CurrPtr
  4165.                 Mov     Word Ptr OLinkPtr, AX
  4166.                 Mov     AX, Word Ptr CurrPtr+2
  4167.                 Mov     Word Ptr OLinkPtr+2, AX
  4168.                 Mov     AX, CurrLen
  4169.                 Add     AX, 6
  4170.                 Mov     OLinkLen, AX
  4171.  
  4172.                 Mov     BX, DeCompHandle
  4173.                 Mov     CX, 6
  4174.                 Mov     DX, Offset IOBuffer
  4175.                 CallDOS WriteOp
  4176.                 Call    CheckWriteError
  4177.  
  4178. PutBlock_3B:
  4179.                 Mov     Word Ptr NextPtr, 0FFFFh
  4180.                 Mov     Word Ptr NextPtr+2, 0FFFFh
  4181.                 Mov     NextLen, 0FFFFh
  4182.  
  4183.  
  4184. PutBlock_4:     Mov     DX, Word Ptr CurrPtr
  4185.                 Mov     Word Ptr PrevPtr, DX
  4186.                 Mov     CX, Word Ptr CurrPtr+2
  4187.                 Mov     Word Ptr PrevPtr+2, CX
  4188.                 Mov     BX, DeCompHandle
  4189.                 Mov     AL, 0
  4190.                 CallDOS SeekOp
  4191.  
  4192.                 Mov     SI, AdvancePtr
  4193.                 Mov     AX, Word Ptr NextPtr
  4194.                 Mov     Word Ptr [SI-6], AX
  4195.                 Mov     AX, Word Ptr NextPtr+2
  4196.                 Mov     Word Ptr [SI-4], AX
  4197.                 Mov     AX, NextLen
  4198.                 Mov     Word Ptr [SI-2], AX
  4199.  
  4200.                 Mov     AX, LenToWrite
  4201.                 Cmp     AX, CurrLen
  4202.                 JAE     PutBlock_5
  4203.  
  4204.                 Mov     CurrLen, AX
  4205.  
  4206. PutBlock_5:
  4207.                 Mov     DX, AdvancePtr
  4208.                 Sub     DX, 6
  4209.                 Mov     CX, CurrLen
  4210.                 Add     CX, 6
  4211.                 Mov     BX, DeCompHandle
  4212.                 CallDOS WriteOp
  4213.                 Call    CheckWriteError
  4214.  
  4215.                 Mov     AX, CurrLen
  4216.                 Sub     LenToWrite, AX
  4217.                 Add     AdvancePtr, AX
  4218.  
  4219.                 Mov     DX, Word Ptr NextPtr
  4220.                 Mov     Word Ptr CurrPtr, DX
  4221.                 Mov     CX, Word Ptr NextPtr+2
  4222.                 Mov     Word Ptr CurrPtr+2, CX
  4223.                 Mov     AX, NextLen
  4224.                 Mov     CurrLen, AX
  4225.  
  4226.                 Jmp     PutBlock_1
  4227.  
  4228. PutBlock        EndP
  4229.  
  4230.  
  4231. ;-----------------------------------------------------------------;
  4232. ;       Get the control record, if necessary                      ;
  4233. ;-----------------------------------------------------------------;
  4234.  
  4235. GetControlRec   Proc    Near
  4236.                 Push    AX
  4237.                 Push    BX
  4238.                 Push    CX
  4239.                 Push    DX
  4240.  
  4241.                 Mov     AX, GetCtrlPID
  4242.                 Cmp     AX, CtrlPID
  4243.                 JNE     ReadTheCtrlRec
  4244.                 Mov     AX, GetCtrlHandle
  4245.                 Cmp     AX, CtrlHandle
  4246.                 JNE     ReadTheCtrlRec
  4247.  
  4248.                 Jmp     AlreadyHaveCtrl
  4249.  
  4250. ReadTheCtrlRec:
  4251.                 Call    WriteTheCtrlRec
  4252.  
  4253.                 Mov     AX, GetCtrlHandle
  4254.                 Mov     CtrlHandle, AX
  4255.                 Mov     AX, GetCtrlPID
  4256.                 Mov     CtrlPID, AX
  4257.  
  4258.                 Mov     CX, 0           ; get control record
  4259.                 Mov     DX, CX          ; from beginning of file
  4260.                 Mov     AX, CX
  4261.                 Mov     BX, CtrlHandle
  4262.                 CallDOS SeekOp
  4263.  
  4264.                 Mov     CX, CtrlSize
  4265.                 Mov     BX, CtrlHandle
  4266.                 Mov     DX, Offset CtrlBuffer
  4267.                 CallDOS ReadOp
  4268.                 Call    CheckReadError
  4269.  
  4270. AlreadyHaveCtrl:
  4271.                 Pop     DX
  4272.                 Pop     CX
  4273.                 Pop     BX
  4274.                 Pop     AX
  4275.  
  4276.                 Ret
  4277. GetControlRec   EndP
  4278.  
  4279.  
  4280. ;-----------------------------------------------------------------;
  4281. ;       Write the control record to the beginning of the file     ;
  4282. ;-----------------------------------------------------------------;
  4283.  
  4284. WriteTheCtrlRec Proc    Near
  4285.                 Cmp     CtrlDirty, 0
  4286.                 JE      WriteCtrlExit
  4287.  
  4288.                 Push    AX
  4289.                 Push    BX
  4290.                 Push    CX
  4291.                 Push    DX
  4292.  
  4293.                 Mov     CX, 0                   ; seek to beginning of file
  4294.                 Mov     DX, CX
  4295.                 Mov     AL, 0
  4296.                 Mov     BX, CtrlHandle
  4297.                 CallDOS SeekOp
  4298.  
  4299.                 Mov     BX, CtrlHandle          ; re-write control record
  4300.                 Mov     DX, Offset CtrlBuffer
  4301.                 Mov     CX, CtrlSize
  4302.                 CallDOS WriteOp
  4303.                 Call    CheckWriteError
  4304.  
  4305.                 Mov     CtrlDirty, 0
  4306.  
  4307.                 Pop     DX
  4308.                 Pop     CX
  4309.                 Pop     BX
  4310.                 Pop     AX
  4311.  
  4312. WriteCtrlExit:
  4313.                 Ret
  4314. WriteTheCtrlRec EndP
  4315.  
  4316.  
  4317. ;-----------------------------------------------------------------;
  4318. ;       Get the pointer record that corresponds to the            ;
  4319. ;       block # in PointerBlock.                                  ;
  4320. ;-----------------------------------------------------------------;
  4321.  
  4322. GetPointerRec   Proc    Near
  4323.                 Push    AX
  4324.                 Push    BX
  4325.                 Push    CX
  4326.                 Push    DX
  4327.  
  4328.                 Mov     BX, GetPtrsPID
  4329.                 Cmp     BX, PtrsPID
  4330.                 JNE     Read1stPtrsRec
  4331.                 Mov     BX, GetPtrsHandle
  4332.                 Cmp     BX, PtrsHandle
  4333.                 JNE     Read1stPtrsRec
  4334.  
  4335.                 Jmp     GetRightPointers
  4336.  
  4337. Read1stPtrsRec:
  4338.                 Call    WritePointerRec
  4339.  
  4340.                 Mov     AX, GetPtrsHandle
  4341.                 Mov     PtrsHandle, AX
  4342.                 Mov     AX, GetPtrsPID
  4343.                 Mov     PtrsPID, AX
  4344.  
  4345.                 Mov     CX, 0           ; get first pointers record
  4346.                 Mov     DX, 16
  4347.                 Mov     AX, 0
  4348.                 Mov     BX, PtrsHandle
  4349.                 CallDOS SeekOp
  4350.                 Mov     Word Ptr PtrsFilePos, AX
  4351.                 Mov     Word Ptr PtrsFilePos+2, DX
  4352.  
  4353.                 Mov     CX, PtrsSize
  4354.                 Mov     BX, PtrsHandle
  4355.                 Mov     DX, Offset Ctrl_Pointers
  4356.                 CallDOS ReadOp
  4357.                 Call    CheckReadError
  4358.  
  4359.                 Mov     PointersStart, 0
  4360.                 Mov     PointersEnd,   NumPtrs-1
  4361.  
  4362. GetRightPointers:
  4363.                 Mov     AX, PointerBlock
  4364.                 Cmp     AX, PointersStart
  4365.                 JB      ChainBack
  4366.                 Jmp     LastPtrTest
  4367.  
  4368. ChainBack:
  4369.                 Call    WritePointerRec
  4370.                 Mov     CX, Word Ptr Ctrl_Prev+2      ; chain backwards
  4371.                 Mov     DX, Word Ptr Ctrl_Prev
  4372.                 Mov     BX, PtrsHandle
  4373.                 Mov     AL, 0
  4374.                 CallDOS SeekOp
  4375.                 Mov     DX, Offset Ctrl_Pointers
  4376.                 Mov     BX, PtrsHandle
  4377.                 Mov     CX, PtrsSize
  4378.                 CallDOS ReadOp
  4379.                 Call    CheckReadError
  4380.  
  4381.                 Sub     PointersStart, NumPtrs
  4382.                 Sub     PointersEnd,   NumPtrs
  4383.                 Jmp     GetRightPointers
  4384.  
  4385. LastPtrTest:
  4386.                 Mov     AX, PointerBlock
  4387.                 Cmp     AX, PointersEnd
  4388.                 JA      ChainForwards
  4389.                 Jmp     GotRightPointers
  4390.  
  4391. ChainForwards:
  4392.                 Call    WritePointerRec
  4393.                 Mov     CX, Word Ptr Ctrl_Next+2      ; chain forwards
  4394.                 Mov     DX, Word Ptr Ctrl_Next
  4395.  
  4396.                 Cmp     CX, 0
  4397.                 JNE     ChainNext
  4398.                 Cmp     DX, 0
  4399.                 JNE     ChainNext
  4400.                 Jmp     CreateNewPointers
  4401.  
  4402. ChainNext:
  4403.                 Mov     BX, PtrsHandle
  4404.                 Mov     AL, 0
  4405.                 CallDOS SeekOp
  4406.                 Mov     Word Ptr PtrsFilePos, AX
  4407.                 Mov     Word Ptr PtrsFilePos+2, DX
  4408.  
  4409.                 Mov     DX, Offset Ctrl_Pointers
  4410.                 Mov     BX, PtrsHandle
  4411.                 Mov     CX, PtrsSize
  4412.                 CallDOS ReadOp
  4413.                 Call    CheckReadError
  4414.  
  4415.                 Add     PointersStart, NumPtrs
  4416.                 Add     PointersEnd,   NumPtrs
  4417.                 Jmp     GetRightPointers
  4418.  
  4419.  
  4420. CreateNewPointers:
  4421.                 Push    Word Ptr PtrsFilePos
  4422.                 Push    Word Ptr PtrsFilePos+2
  4423.  
  4424.                 Mov     CX, 0                   ; seek to end of file
  4425.                 Mov     DX, CX
  4426.                 Mov     AL, 2
  4427.                 Mov     BX, PtrsHandle
  4428.                 CallDOS SeekOp
  4429.                 Mov     Word Ptr Ctrl_Next+2, DX
  4430.                 Mov     Word Ptr Ctrl_Next, AX
  4431.                 Mov     PtrsDirty, 1
  4432.                 Call    WritePointerRec
  4433.  
  4434.                 Mov     DI, Offset Ctrl_Pointers
  4435.                 Mov     AX, 0
  4436.                 Mov     CX, 8
  4437.         Rep     StoSW
  4438.                 Mov     AX, 0FFFFh
  4439.                 Mov     CX, (PtrsSize / 2) - 8
  4440.         Rep     StoSW
  4441.  
  4442.                 Pop     Word Ptr Ctrl_Prev+2
  4443.                 Pop     Word Ptr Ctrl_Prev
  4444.  
  4445.                 Mov     AX, GetPtrsHandle
  4446.                 Mov     PtrsHandle, AX
  4447.                 Mov     AX, GetPtrsPID
  4448.                 Mov     PtrsPID, AX
  4449.  
  4450.                 Mov     CX, 0                   ; seek to end of file
  4451.                 Mov     DX, CX
  4452.                 Mov     AL, 2
  4453.                 Mov     BX, PtrsHandle
  4454.                 CallDOS SeekOp
  4455.  
  4456.                 Mov     Word Ptr PtrsFilePos, AX
  4457.                 Mov     Word Ptr PtrsFilePos+2, DX
  4458.  
  4459.                 Add     PointersStart, NumPtrs
  4460.                 Add     PointersEnd,   NumPtrs
  4461.                 Mov     PtrsDirty, 1
  4462.                 Call    WritePointerRec
  4463.  
  4464. GotRightPointers:
  4465.                 Pop     DX
  4466.                 Pop     CX
  4467.                 Pop     BX
  4468.                 Pop     AX
  4469.  
  4470.                 Ret
  4471. GetPointerRec   EndP
  4472.  
  4473. ;-----------------------------------------------------------------;
  4474. ;       Write the current pointer record.                         ;
  4475. ;-----------------------------------------------------------------;
  4476.  
  4477. WritePointerRec Proc    Near
  4478.                 Cmp     PtrsDirty, 0
  4479.                 JE      WritePtrsExit
  4480.  
  4481.                 Push    AX
  4482.                 Push    BX
  4483.                 Push    CX
  4484.                 Push    DX
  4485.  
  4486.                 Mov     CX, Word Ptr PtrsFilePos+2
  4487.                 Mov     DX, Word Ptr PtrsFilePos
  4488.                 Mov     AX, 0
  4489.                 Mov     BX, PtrsHandle
  4490.                 CallDOS SeekOp
  4491.  
  4492.                 Mov     BX, PtrsHandle
  4493.                 Mov     DX, Offset Ctrl_Pointers
  4494.                 Mov     CX, PtrsSize
  4495.                 CallDOS WriteOp
  4496.                 Call    CheckWriteError
  4497.  
  4498.                 Mov     PtrsDirty, 0
  4499.  
  4500.                 Pop     DX
  4501.                 Pop     CX
  4502.                 Pop     BX
  4503.                 Pop     AX
  4504.  
  4505. WritePtrsExit:
  4506.                 Ret
  4507. WritePointerRec EndP
  4508.  
  4509.  
  4510. ;-----------------------------------------------------------------;
  4511. ;       if handled dup'd, make file pos the same for both.        ;
  4512. ;-----------------------------------------------------------------;
  4513.  
  4514. AlignDupedFiles Proc    Near
  4515.                 Push    AX
  4516.                 Push    BX
  4517.                 Push    SI
  4518.                 Push    DI
  4519.  
  4520.                 Mov     SI, TablePtr
  4521.                 Mov     DI, DupeTable [SI]
  4522.                 Cmp     DI, 0FFFFh
  4523.                 JE      AlignExit
  4524.                 Shl     DI, 1
  4525.                 Shl     SI, 1
  4526.                 Mov     AX, Word Ptr FilePosTbl [SI]
  4527.                 Mov     BX, Word Ptr FilePosTbl+2 [SI]
  4528.                 Mov     Word Ptr FilePosTbl [DI], AX
  4529.                 Mov     Word Ptr FilePosTbl+2 [DI], BX
  4530. AlignExit:
  4531.                 Pop     DI
  4532.                 Pop     SI
  4533.                 Pop     BX
  4534.                 Pop     AX
  4535.                 Ret
  4536. AlignDupedFiles EndP
  4537.  
  4538.  
  4539. ;-----------------------------------------------------------------;
  4540. ;       Get a buffer of Diet.Dir bytes into                       ;
  4541. ;       'ScreenSave'.                                             ;
  4542. ;-----------------------------------------------------------------;
  4543.  
  4544. FGetBuff        Proc    Near
  4545. FGB1:           Mov     SI, fbufndx
  4546.                 Cmp     SI, fbufbytes
  4547.                 JAE     FGB2
  4548.  
  4549.                 Mov     AL, ScreenSave[SI]
  4550.                 Inc     fbufndx
  4551.                 Jmp     Short FGB_Exit
  4552.  
  4553. FGB2:           Mov     DX, Offset ScreenSave
  4554.                 Mov     BX, DietDirHandle
  4555.                 Mov     CX, 160
  4556.                 CallDOS ReadOp
  4557.                 JC      FGB_Eof
  4558.                 Cmp     AX, 0
  4559.                 JE      FGB_Eof
  4560.  
  4561.                 Mov     fbufbytes, AX
  4562.                 Mov     fbufndx, 0
  4563.                 Jmp     Short FGB1
  4564.  
  4565. FGB_Eof:        Mov     fbufndx, MaxTextBuf
  4566.                 Mov     AL, 0FFh
  4567.  
  4568. FGB_Exit:       Ret
  4569. FGetBuff        EndP
  4570.  
  4571.  
  4572. ;-----------------------------------------------------------------;
  4573. ;                                                                 ;
  4574. ;       Switch DTAs before parsing Diet.Dir                       ;
  4575. ;                                                                 ;
  4576. ;-----------------------------------------------------------------;
  4577.  
  4578. UseOurDTA       Proc    Near
  4579.                 CallDOS GetDTAOp
  4580.                 Mov     OldDTAOfs, BX
  4581.                 Mov     OldDTASeg, ES
  4582.                 Push    DS
  4583.                 LDS     DX, OurDTA
  4584.                 CallDOS SetDTAOp
  4585.                 Pop     DS
  4586.                 Push    DS
  4587.                 Pop     ES
  4588.                 Ret
  4589. UseOurDTA       EndP
  4590.  
  4591.  
  4592. SetOldDTA       Proc    Near
  4593.                 Push    DS
  4594.                 LDS     DX, OldDTA
  4595.                 CallDOS SetDTAOp
  4596.                 Pop     DS
  4597.                 Ret
  4598. SetOldDTA       EndP
  4599.  
  4600.  
  4601. ;-----------------------------------------------------------------;
  4602. ;       Search 'DIET.DIR' for this file name                      ;
  4603. ;       Return Carry-True if file not found                       ;
  4604. ;-----------------------------------------------------------------;
  4605.  
  4606. SearchDietDir   Proc    Near
  4607.                 Call    UseOurDTA
  4608.                 Call    SetOurPID
  4609.                 Mov     DietEOF, 0
  4610.                 Call    Parse_DS_DX_Name
  4611.  
  4612.                 Call    TooManyCheck
  4613.                 JNC     Search_0
  4614.                 Jmp     Short JustGoAway
  4615.  
  4616. Search_0:
  4617.                 Mov     DX, Offset DietPath
  4618.                 Mov     AL, RD_ONLY
  4619.                 CallDOS OpenOp
  4620.                 JNC     Search_1
  4621.  
  4622. JustGoAway:
  4623.                 Call    SetOldDTA
  4624.                 Call    SetOldPID
  4625.                 STC
  4626.                 Ret
  4627.  
  4628. Search_1:
  4629.                 Mov     DietDirHandle, AX
  4630.                 Mov     fbufbytes, 0
  4631.                 Mov     fbufndx, MaxTextBuf
  4632.  
  4633. Search_2A:
  4634.                 Mov     AL, 0
  4635.                 Mov     CX, MaxName
  4636.                 Mov     DI, Offset NameBuffer
  4637.         Rep     StoSB
  4638.                 Mov     CharPos, 0
  4639.  
  4640. Search_2:
  4641.                 Call    FGetBuff                ; get a byte of DietDir
  4642.                                                 ; into AL
  4643. Search_TestEOF:
  4644.                 Cmp     AL, 0FFh                ; EOF?
  4645.                 JNE     Search_3
  4646.  
  4647.                 Mov     DietEOF, 1            ; no more input
  4648.                 Jmp     Search_4                ; go look at last name
  4649.  
  4650. Search_3:
  4651.                 Cmp     AL, 10
  4652.                 JE      Search_2
  4653.                 Cmp     AL, 26
  4654.                 JE      Search_2
  4655.  
  4656.                 Mov     SI, CharPos
  4657.                 Cmp     AL, 13
  4658.                 JE      Search_3C
  4659.  
  4660.                 Mov     NameBuffer[SI], AL
  4661.                 Cmp     CharPos, MaxName-1
  4662.                 JE      Search_4
  4663.  
  4664.                 Inc     CharPos                 ; go get next char
  4665.                 Jmp     Search_2
  4666.  
  4667. Search_3C:
  4668.                 Mov     NameBuffer[SI], 0
  4669.                 Jmp     Search_4
  4670.  
  4671.  
  4672. ;- - - - - - - - - - - - - - - - - - - - - - - 
  4673.  
  4674. GoBackToSearch_2A:
  4675.                 Jmp     Search_2A               ; a local jumping place
  4676.  
  4677. Search_4:
  4678.                 Mov     AX, CharPos
  4679.                 XChg    AH, AL
  4680.                 Or      AX, DietEOF
  4681.                 Cmp     AX, 0001h               ; EOF and empty line?
  4682.                 JE      Search_9
  4683.                 Cmp     AH, 0                   ; empty line?
  4684.                 JE      GoBackToSearch_2A
  4685.  
  4686.                 Cmp     NameBuffer, ' '         ; if first char is blank,
  4687.                 JE      GoBackToSearch_2A       ; ignore line
  4688.                 Cmp     NameBuffer, ';'         ; do the same if it starts
  4689.                 JE      GoBackToSearch_2A       ; with a semicolon
  4690.  
  4691.                 Call    IsThisIt                ; is this line of Diet.Dir
  4692.                 JNC     Search_5                ; the filename being created?
  4693.  
  4694.                 Cmp     DietEOF, 1              ; are we all done looking?
  4695.                 JE      Search_9
  4696.  
  4697.                 Jmp     Search_2A               ; no, go read another line
  4698.  
  4699. Search_5:
  4700.                 Mov     BX, DietDirHandle
  4701.                 CallDOS CloseOp
  4702.                 Call    SetOldDTA
  4703.                 Call    SetOldPID
  4704.                 CLC
  4705.                 Ret
  4706.  
  4707. Search_9:
  4708.                 Mov     BX, DietDirHandle
  4709.                 CallDOS CloseOp
  4710.                 Call    SetOldDTA
  4711.                 Call    SetOldPID
  4712.                 STC
  4713.                 Ret
  4714. SearchDietDir EndP
  4715.  
  4716.  
  4717. ;-----------------------------------------------------------------;
  4718. ;       Turn DS:DX path/file name into something                  ;
  4719. ;       we can compare against.  Put resulting filename           ;
  4720. ;       in CreateName and put length in CreateLength.             ;
  4721. ;-----------------------------------------------------------------;
  4722.  
  4723. Parse_DS_DX_Name Proc   Near
  4724.                 Push    DS
  4725.                 Pop     ES
  4726.                 Mov     AL, 0
  4727.                 Mov     CX, MaxName
  4728.                 Mov     DI, Offset CreateName
  4729.         Rep     StoSB
  4730.  
  4731.                 LES     DI, CreatePtr           ; calc length of DSDX name
  4732.                 Mov     BX, DI
  4733.                 Mov     CX, MaxName
  4734.                 Mov     AL, 0
  4735.         RepNE   ScaSB
  4736.                 Sub     DI, BX
  4737.                 Mov     CreateLength, DI
  4738.  
  4739.                 Mov     SI, Offset CreateName
  4740.  
  4741.                 LES     DI, CreatePtr           ; old ds:dx pointer
  4742.                 Cmp     Byte Ptr ES:[DI+1], ':'
  4743.                 JE      ParseDSDX_Drive
  4744.  
  4745.                 CallDOS CurrentDiskOp           ; generate <d>:
  4746.                 Add     AL, "A"
  4747.                 Mov     AH, ":"
  4748.                 Jmp     ParseDSDX_GetName
  4749.  
  4750. ParseDSDX_Drive:
  4751.                 Mov     AX, Word Ptr ES:[DI]    ; pick up <d>:
  4752.                 Inc     DI
  4753.                 Inc     DI
  4754.                 Dec     CreateLength
  4755.                 Dec     CreateLength
  4756.                 Cmp     AL, '_'
  4757.                 JBE     ParseDSDX_GetName
  4758.                 And     AL, '_'
  4759.  
  4760. ParseDSDX_GetName:
  4761.                 Mov     Word Ptr CreateName, AX
  4762.                 Inc     SI
  4763.                 Inc     SI
  4764.  
  4765.                 Push    ES                      ; save modified CreatePtr
  4766.                 Push    DI
  4767.  
  4768.                 Cmp     Byte Ptr ES:[DI], '\'   ; do we need cwd?
  4769.                 JE      ParseDSDX_DoRemainder   ; no
  4770.  
  4771.                 Push    DS  
  4772.                 Pop     ES
  4773.  
  4774.                 Mov     Byte Ptr [SI], '\'
  4775.                 Inc     SI
  4776.                 Mov     DL, Byte Ptr CreateName
  4777.                 Sub     DL, '@'
  4778.                 CallDOS GetCurrDir
  4779.                 Mov     DI, Offset CreateName
  4780.                 Mov     CX, MaxName
  4781.                 Mov     AL, 0
  4782.         RepNE   ScaSB
  4783.                 Dec     DI
  4784.                 Mov     SI, DI
  4785.                 Cmp     Byte Ptr [SI-1], '\'
  4786.                 JE      ParseDSDX_DoRemainder
  4787.                 Mov     Byte Ptr [SI], '\'
  4788.                 Inc     SI
  4789.  
  4790. ParseDSDX_DoRemainder:
  4791.                 Mov     CX, CreateLength
  4792.                 Mov     AX, DS
  4793.                 Mov     BX, SI
  4794.                 Pop     SI              ; recover modified CreatePtr
  4795.                 Pop     DS
  4796.                 Mov     ES, AX
  4797.                 Mov     DI, BX
  4798.         Rep     MovSB
  4799.                 Mov     Byte Ptr ES:[DI], 0
  4800.  
  4801.                 Push    CS              ; restore addressability
  4802.                 Pop     DS
  4803.                 Push    DS
  4804.                 Pop     ES
  4805.  
  4806.                 Mov     DI, Offset CreateName
  4807.                 Mov     BX, DI
  4808.                 Mov     CX, MaxName
  4809.                 Mov     AL, 0
  4810.         RepNE   ScaSB
  4811.                 Mov     CX, DI
  4812.                 Dec     CX
  4813.                 Sub     CX, BX
  4814.                 Mov     CreateLength, CX
  4815.                 STD
  4816.                 Mov     CX, MaxName
  4817.                 Mov     AL, '\'
  4818.         RepNE   ScaSB
  4819.                 CLD
  4820.                 Inc     DI
  4821.                 Inc     DI
  4822.                 Sub     DI, BX
  4823.                 Mov     DirLength, DI
  4824.  
  4825.                 Ret
  4826. Parse_DS_DX_Name EndP
  4827.  
  4828. ;-----------------------------------------------------------------;
  4829. ;       See if NameBuffer (from DIET.DIR) is the same as          ;
  4830. ;       the filename just created.  Return Carry-Clear if equal.  ;
  4831. ;-----------------------------------------------------------------;
  4832.  
  4833. IsThisIt        Proc    Near
  4834.                 Mov     DI, Offset NameBuffer
  4835.                 Mov     SI, Offset CreateName
  4836.                 Mov     CX, DirLength
  4837.  
  4838. ; directory names must match exactly
  4839.  
  4840. fmd1:           mov     al,byte ptr [si]
  4841.                 cmp     al,'_'
  4842.                 jbe     fmd2
  4843.                 and     al,'_'
  4844.  
  4845. fmd2:           mov     bl,byte ptr [di]
  4846.                 cmp     bl,'_'
  4847.                 jbe     fmd3
  4848.                 and     bl,'_'
  4849.  
  4850. fmd3:           cmp     al,bl
  4851.                 je      fmd4
  4852.  
  4853.                 cmp     bl, '='
  4854.                 jne     no_dir_match
  4855.  
  4856.                 clc
  4857.                 jmp     fm1
  4858.  
  4859. no_dir_match:   stc
  4860.                 jmp     fm1
  4861.  
  4862. fmd4:           inc     si
  4863.                 inc     di
  4864.                 loop    fmd1
  4865.  
  4866.  
  4867. ; do the filename portion separately from the extension
  4868.  
  4869. fm2:            mov     al,byte ptr [si]
  4870.                 cmp     al,'\'
  4871.                 je      fm11
  4872.                 cmp     al,'_'
  4873.                 jbe     fm3
  4874.                 and     al,'_'
  4875.  
  4876. fm3:            mov     bl,byte ptr [di]
  4877.                 cmp     bl,'\'
  4878.                 je      fm11
  4879.                 cmp     bl,'_'
  4880.                 jbe     fm4
  4881.                 and     bl,'_'
  4882.  
  4883. fm4:            cmp     bl,'*'
  4884.                 jne     fm5
  4885.                 inc     di
  4886.  
  4887. fm6:            cmp     byte ptr [si],0
  4888.                 je      fm8
  4889.                 cmp     byte ptr [si],'.'
  4890.                 je      fm8
  4891.                 inc     si
  4892.                 jmp     short fm6
  4893.  
  4894. fm5:            cmp     al,0
  4895.                 je      fm8
  4896.                 cmp     bl,0
  4897.                 je      fm8
  4898.                 cmp     al,'.'
  4899.                 je      fm8
  4900.                 cmp     bl,'.'
  4901.                 je      fm8
  4902.  
  4903. fm9:            cmp     al,bl
  4904.                 je      fm12
  4905.                 cmp     bl,'?'
  4906.                 jne     fm11
  4907.  
  4908. fm12:           inc     si
  4909.                 inc     di
  4910.                 jmp     fm2
  4911.  
  4912. fm11:           stc
  4913.                 jmp     fm1
  4914.  
  4915.  
  4916. ; now do the extension
  4917.  
  4918. fm8:            mov     al,byte ptr [si]
  4919.                 cmp     al,'_'
  4920.                 jbe     fm13
  4921.                 and     al,'_'
  4922.  
  4923. fm13:           mov     bl,byte ptr [di]
  4924.                 cmp     bl,'_'
  4925.                 jbe     fm14
  4926.                 and     bl,'_'
  4927.  
  4928. fm14:           cmp     al,'.'
  4929.                 jne     fm15
  4930.                 inc     si
  4931.                 jmp     short fm8
  4932.  
  4933. fm15:           cmp     bl,'.'
  4934.                 jne     fm16
  4935.                 inc     di
  4936.                 jmp     short fm8
  4937.  
  4938. fm16:           cmp     bl,'*'
  4939.                 jne     fm17
  4940.                 clc
  4941.                 jmp     short fm1
  4942.  
  4943. fm17:           cmp     al,0
  4944.                 jne     fm18
  4945.                 cmp     bl,0
  4946.                 jne     fm19
  4947.                 clc
  4948.                 jmp     short fm1
  4949.                 jmp     short fm18
  4950.  
  4951. fm19:           stc
  4952.                 jmp     short fm1
  4953.  
  4954. fm18:           cmp     bl,0
  4955.                 jne     fm21
  4956.                 stc
  4957.                 jmp     short fm1
  4958.  
  4959. fm21:           cmp     al,bl
  4960.                 je      fm23
  4961.                 cmp     bl,'?'
  4962.                 jne     fm22
  4963.  
  4964. fm23:           inc     si
  4965.                 inc     di
  4966.                 jmp     fm8
  4967.  
  4968. fm22:           stc
  4969.  
  4970. fm1:            ret
  4971.  
  4972. IsThisIt        Endp
  4973.  
  4974.  
  4975. ;-----------------------------------------------------------------;
  4976. ;       Write initial Control Record                              ;
  4977. ;-----------------------------------------------------------------;
  4978.  
  4979. WriteInitControl Proc   Near
  4980.                 Call    WriteTheCtrlRec
  4981.                 Call    WritePointerRec         ; empty out previous rcds.
  4982.  
  4983.                 Mov     AX, CurrHandle
  4984.                 Mov     CtrlHandle, AX
  4985.                 Mov     AX, OldPID
  4986.                 Mov     CtrlPID, AX
  4987.  
  4988.                 Mov     SI, Offset Control_ZM   ; footprint, filelength
  4989.                 Mov     DI, Offset CtrlBuffer
  4990.                 Mov     CX, Ctrl_ZM_Size / 2
  4991.         Rep     MovSW
  4992.  
  4993.                 Mov     CtrlDirty, 1
  4994.                 Call    WriteTheCtrlRec
  4995.  
  4996.                 Mov     DI, Offset Ctrl_Pointers
  4997.                 Mov     AX, 0
  4998.                 Mov     CX, 8
  4999.         Rep     StoSW
  5000.                 Mov     AX, 0FFFFh
  5001.                 Mov     CX, (PtrsSize / 2) - 8
  5002.         Rep     StoSW
  5003.  
  5004.                 Mov     AX, CurrHandle
  5005.                 Mov     PtrsHandle, AX
  5006.                 Mov     AX, OldPID
  5007.                 Mov     PtrsPID, AX
  5008.                 Mov     Word Ptr PtrsFilePos, 16
  5009.                 Mov     Word Ptr PtrsFilePos+2, 0
  5010.                 Mov     PointersStart, 0
  5011.                 Mov     PointersEnd,   NumPtrs-1
  5012.                 Mov     PtrsDirty, 1
  5013.                 Call    WritePointerRec
  5014.  
  5015.                 Mov     DX, Offset CtrlBuffer   ; now truncate file length
  5016.                 Mov     BX, PtrsHandle
  5017.                 Mov     CX, 0
  5018.                 CallDOS WriteOp
  5019.                 Call    CheckWriteError
  5020.  
  5021.                 Ret
  5022. WriteInitControl EndP
  5023.  
  5024. ;-----------------------------------------------------------------;
  5025. ;       Read ctrl rec, if present, to determine if file skinny.   ;
  5026. ;       Return Carry-Clear if it's a skinny file.                 ;
  5027. ;-----------------------------------------------------------------;
  5028.  
  5029. ReadFootPrint   Proc    Near
  5030.                 Mov     CritFlag, 0
  5031.  
  5032.                 Mov     AL, 24h
  5033.                 CallDOS GetVectorOp
  5034.                 Mov     Int24Ofs, BX
  5035.                 Mov     Int24Seg, ES
  5036.  
  5037.                 Push    CS
  5038.                 Pop     ES
  5039.  
  5040.                 Mov     AL, 24h
  5041.                 Mov     DX, Offset ISR24
  5042.                 CallDOS SetVectorOp
  5043.  
  5044.                 Call    TooManyCheck
  5045.                 JC      ReadCtrlFailed
  5046.  
  5047.                 Mov     BX, CurrHandle
  5048.                 Mov     AX, 0
  5049.                 CallDOS IOCTL
  5050.                 Test    CritFlag, 1
  5051.                 JNZ     ReadCtrlFailed
  5052.                 Test    DL, 80h
  5053.                 JNZ     ReadCtrlFailed
  5054.  
  5055.                 Mov     BX, CurrHandle          ; file just opened...is
  5056.                 Mov     CX, 16                  ; already at beginning
  5057.                 Mov     DX, Offset FootBuffer   ; read just 16 bytes
  5058.                 CallDOS ReadOp
  5059.                 JC      ReadCtrlFailed          ; file I/O error.
  5060.                 Test    CritFlag, 1
  5061.                 JNZ     ReadCtrlFailed
  5062.  
  5063.                 Push    CX
  5064.                 Push    AX
  5065.  
  5066.                 Mov     AX, 0                   ; position file back at beginning
  5067.                 Mov     CX, 0
  5068.                 Mov     DX, CX
  5069.                 Mov     BX, CurrHandle
  5070.                 CallDOS SeekOp
  5071.                 Test    CritFlag, 1
  5072.                 JNZ     ReadCtrlFailed
  5073.  
  5074.                 Pop     AX
  5075.                 Pop     CX
  5076.  
  5077.                 Cmp     AX, CX
  5078.                 JNE     ReadCtrlFailed          ; file too short       
  5079.                                                 ; (no ctrl record)
  5080.                 Mov     SI, Offset Control_ZM
  5081.                 Mov     DI, Offset FootBuffer
  5082.                 Mov     CX, 3
  5083.         RepE    CmpSW
  5084.                 JNE     ReadCtrlFailed          ; footprint not there.
  5085.  
  5086.                 Jmp     ReadCtrlOkay            ; it's one of ours!
  5087.  
  5088. ReadCtrlFailed:
  5089.                 Mov     AL, 24h
  5090.                 Mov     DX, Int24Ofs
  5091.                 Mov     DS, Int24Seg
  5092.                 CallDOS SetVectorOp
  5093.                 Push    CS
  5094.                 Pop     DS
  5095.                 Mov     CritFlag, 0
  5096.  
  5097.                 STC
  5098.                 Ret
  5099.  
  5100. ReadCtrlOkay:
  5101.                 Mov     AL, 24h
  5102.                 Mov     DX, Int24Ofs
  5103.                 Mov     DS, Int24Seg
  5104.                 CallDOS SetVectorOp
  5105.                 Push    CS
  5106.                 Pop     DS
  5107.                 Mov     CritFlag, 0
  5108.  
  5109.                 CLC
  5110.                 Ret
  5111. ReadFootPrint   EndP
  5112.  
  5113.  
  5114. ;-----------------------------------------------------------------;
  5115. ;       Store file handle, etc. for this skinny file              ;
  5116. ;-----------------------------------------------------------------;
  5117.  
  5118. RememberThisFile Proc   Near
  5119.                 Call    SearchTable
  5120.                 Mov     BX, TablePtr
  5121.  
  5122.                 Mov     AX, CurrHandle
  5123.                 Mov     FileHandleTbl [BX], AX
  5124.  
  5125.                 Mov     AX, OldPID
  5126.                 Mov     PIDTbl [BX], AX
  5127.  
  5128.                 Shl     BX, 1
  5129.                 Mov     Word Ptr FilePosTbl [BX], 0     ; dbl-word-sized
  5130.                 Mov     Word Ptr FilePosTbl [BX+2], 0
  5131.  
  5132.                 Inc     FileCount
  5133.                 Ret
  5134. RememberThisFile EndP
  5135.  
  5136. ;-----------------------------------------------------------------;
  5137. ;       Un-Store file handle, etc....file is now closed           ;
  5138. ;-----------------------------------------------------------------;
  5139.  
  5140. ForgetThisFile  Proc    Near
  5141.                 Mov     BX, TablePtr
  5142.                 Mov     AX, FileHandleTbl [BX]
  5143.  
  5144.                 Mov     FileHandleTbl [BX], 0FFFFh      ; mark table
  5145.                 Mov     PIDTbl [BX], 0FFFFh             ; entries as empty
  5146.  
  5147.                 Mov     SI, BX
  5148.                 Mov     DI, DupeTable [SI]
  5149.                 Cmp     DI, 0FFFFh
  5150.                 JE      Forget_1
  5151.  
  5152.                 Mov     DupeTable [SI], 0FFFFh
  5153.                 Mov     DupeTable [DI], 0FFFFh
  5154.  
  5155. Forget_1:       Shl     BX, 1
  5156.                 Mov     Word Ptr FilePosTbl [BX], 0
  5157.                 Mov     Word Ptr FilePosTbl [BX+2], 0
  5158.  
  5159. Forget_2:       Cmp     AX, CtrlHandle
  5160.                 JNE     Forget_3
  5161.                 Mov     CtrlHandle, 0FFFFh
  5162. Forget_3:       Cmp     AX, PtrsHandle
  5163.                 JNE     Forget_4
  5164.                 Mov     PtrsHandle, 0FFFFh
  5165. Forget_4:       Cmp     AX, DeCompHandle
  5166.                 JNE     Forget_9
  5167.                 Mov     DeCompHandle, 0FFFFh
  5168.  
  5169. Forget_9:       Cmp     FileCount, 0
  5170.                 JE      ForgetExit
  5171.  
  5172.                 Dec     FileCount
  5173.  
  5174. ForgetExit:     Ret
  5175. ForgetThisFile  EndP
  5176.  
  5177. ;-----------------------------------------------------------------;
  5178. ;       Find this handle/PID in table (or find 1st free element)  ;
  5179. ;                                                                 ;
  5180. ;       If found, return TablePtr = that location and return      ;
  5181. ;       Carry-Clear.                                              ;
  5182. ;                                                                 ;
  5183. ;       If not found, return TablePtr = first free position       ;
  5184. ;       and Carry-Set.                                            ;
  5185. ;-----------------------------------------------------------------;
  5186.  
  5187. SearchTable     Proc    Near
  5188.                 Mov     AX, 0FFFFh
  5189.                 Mov     DI, Offset FileHandleTbl
  5190.                 Mov     BP, DI
  5191.                 Mov     CX, MaxHandles
  5192.                 Push    CX
  5193.                 Push    DI
  5194.         RepNE   ScaSW
  5195.                 Dec     DI
  5196.                 Dec     DI
  5197.                 Sub     DI, BP
  5198.                 Mov     TablePtr, DI
  5199.  
  5200.                 Pop     DI
  5201.                 Pop     CX
  5202.                 Mov     AX, CurrHandle
  5203.         RepNE   ScaSW
  5204.                 JNE     SearchTable_8
  5205.  
  5206.                 Dec     DI
  5207.                 Dec     DI
  5208.                 Sub     DI, BP
  5209.                 Mov     AX, OldPID
  5210.                 Cmp     AX, PIDTbl [DI]
  5211.                 JNE     SearchTable_8
  5212.  
  5213.                 Mov     TablePtr, DI
  5214.                 CLC
  5215.                 Ret
  5216.  
  5217. SearchTable_8:
  5218.                 STC
  5219.                 Ret
  5220.  
  5221. SearchTable     EndP
  5222.  
  5223.  
  5224. ;-----------------------------------------------------------------;
  5225. ;       Save the application PID                                  ;
  5226. ;-----------------------------------------------------------------;
  5227.  
  5228.  
  5229. GetOldPID       Proc    Near
  5230.                 Xor     AX, AX                  ;to get PSP from DOS
  5231.                 CallDOS 51h                     ;current PSP now in BX
  5232.                 Mov     OldPID, BX              ;save it
  5233.                 Ret
  5234. GetOldPID       EndP
  5235.  
  5236.  
  5237. ;-----------------------------------------------------------------;
  5238. ;       Tell DOS to use our PID                                   ;
  5239. ;-----------------------------------------------------------------;
  5240.  
  5241. SetOurPID       Proc    Near
  5242.                 Mov     BX, OurPID              ;set our PSP instead
  5243.                 Xor     AX, AX
  5244.                 CallDOS 50h
  5245.                 Ret
  5246. SetOurPID       EndP
  5247.  
  5248. ;-----------------------------------------------------------------;
  5249. ;       Tell DOS to resume using the application PID              ;
  5250. ;-----------------------------------------------------------------;
  5251.  
  5252. SetOldPID       Proc    Near
  5253.                 Mov     BX, OldPID
  5254.                 Xor     AX, AX
  5255.                 CallDOS 50h
  5256.                 Ret
  5257. SetOldPID       EndP
  5258.  
  5259. ;-----------------------------------------------------------------;
  5260. ;                                                                 ;
  5261. ;       The actual DECOMPRESS logic                               ;
  5262. ;       A simple implementation of Lempel-Ziv-Welch               ;
  5263. ;                                                                 ;
  5264. ;-----------------------------------------------------------------;
  5265.  
  5266. DeCompress      Proc    Near
  5267. d1:             call    read_code
  5268.                 cmp     ax,eof
  5269.                 jne     d2
  5270.  
  5271. d1a:            ret
  5272.  
  5273. d2:             cmp     ax,clear
  5274.                 jne     d7
  5275.  
  5276.                 mov     nbits,K9
  5277.                 mov     max_code,K512
  5278.                 mov     free_code,first_free
  5279.  
  5280.                 call    read_code
  5281.  
  5282.                 mov     cur_code,ax
  5283.                 mov     old_code,ax
  5284.                 mov     k,al
  5285.                 mov     fin_char,al
  5286.                 mov     al,k
  5287.  
  5288.                 call    write_char
  5289.                 jmp     d1
  5290.  
  5291. d7:             mov     cur_code,ax
  5292.                 mov     in_code,ax
  5293.  
  5294.                 cmp     ax,free_code
  5295.                 jl      d11
  5296.  
  5297.                 mov     ax,old_code
  5298.                 mov     cur_code,ax
  5299.                 mov     al,fin_char
  5300.  
  5301.                 push    ax
  5302.                 inc     stack_count
  5303.  
  5304. d11:            cmp     cur_code,255
  5305.                 jle     d15
  5306.  
  5307.                 mov     bx,cur_code
  5308.                 mov     al, char [bx]
  5309.                 push    ax
  5310.                 inc     stack_count
  5311.                 shl     bx, 1
  5312.                 mov     ax, next [bx]
  5313.                 mov     cur_code,ax
  5314.  
  5315.                 jmp     d11
  5316.  
  5317. d15:            mov     ax,cur_code
  5318.                 mov     fin_char,al
  5319.                 mov     k,al
  5320.  
  5321.                 push    ax
  5322.                 inc     stack_count
  5323.                 mov     cx,stack_count
  5324.  
  5325.                 jcxz    d18
  5326.  
  5327. d17:            pop     ax
  5328.                 call    write_char
  5329.                 loop    d17
  5330.  
  5331. d18:            mov     stack_count,cx
  5332.                 call    d_add_code
  5333.  
  5334.                 mov     ax,in_code
  5335.                 mov     old_code,ax
  5336.                 mov     bx,free_code
  5337.                 cmp     bx,max_code
  5338.                 jl      d23
  5339.  
  5340.                 cmp     nbits,K10
  5341.                 je      d23
  5342.  
  5343.                 inc     nbits
  5344.                 shl     max_code,1
  5345.  
  5346. d23:            jmp     d1
  5347.  
  5348. DeCompress      EndP
  5349.  
  5350.  
  5351. read_code       proc    near
  5352.                 mov     ax,bit_offset
  5353.                 add     ax,nbits
  5354.                 xchg    bit_offset,ax
  5355.                 mov     cx,8
  5356.                 xor     dx,dx
  5357.                 div     cx
  5358.  
  5359. drd0:           add     ax,offset IOBuffer
  5360.                 mov     si,ax
  5361.                 lodsw
  5362.  
  5363.                 mov     bx,ax
  5364.                 lodsb
  5365.  
  5366.                 mov     cx,dx
  5367.                 jcxz    drd2
  5368.  
  5369. drd1:           shr     al,1
  5370.                 rcr     bx,1
  5371.                 loop    drd1
  5372.  
  5373. drd2:           mov     ax,bx
  5374.                 mov     bx,nbits
  5375.                 sub     bx,K9
  5376.                 shl     bx,1
  5377.                 and     ax,masks[bx]
  5378.  
  5379.                 ret
  5380. read_code       endp
  5381.  
  5382.  
  5383.  
  5384. write_char      proc    near
  5385.                 mov     di,output_offset
  5386.                 lea     di,DeCompBuffer[di]
  5387.                 stosb
  5388.                 inc     output_offset
  5389.                 ret
  5390. write_char      endp
  5391.  
  5392.  
  5393. d_add_code      proc    near
  5394.                 mov     bx,free_code
  5395.                 mov     al,k
  5396.                 mov     char [bx],al
  5397.                 mov     ax,old_code
  5398.                 shl     bx,1
  5399.                 mov     next [bx],ax
  5400.  
  5401.                 inc     free_code
  5402.                 ret
  5403. d_add_code      endp
  5404.  
  5405. ;-----------------------------------------------------------------;
  5406. ;                                                                 ;
  5407. ;       The actual COMPRESS logic                                 ;
  5408. ;       A simple implementation of Lempel-Ziv-Welch               ;
  5409. ;                                                                 ;
  5410. ;-----------------------------------------------------------------;
  5411.  
  5412. Compress        Proc    Near
  5413. l1:             call    init_table
  5414.                 mov     ax,clear
  5415.                 call    write_code
  5416.  
  5417.                 call    read_char
  5418.  
  5419. l4:             xor     ah,ah
  5420.  
  5421. l4a:            mov     prefix_code,ax
  5422.                 call    read_char
  5423.                 jc      l17
  5424.  
  5425.                 mov     k,al
  5426.                 mov     bx,prefix_code
  5427.                 call    lookup_code
  5428.                 jnc     l4a
  5429.  
  5430.                 call    add_code
  5431.  
  5432.                 push    bx
  5433.                 mov     ax,prefix_code
  5434.                 call    write_code
  5435.                 pop     bx
  5436.  
  5437.                 mov     al,k
  5438.                 cmp     bx,max_code
  5439.                 jl      l4
  5440.  
  5441.                 cmp     nbits,K10
  5442.                 jl      l14
  5443.  
  5444.                 mov     ax,clear
  5445.                 call    write_code
  5446.                 call    init_table
  5447.  
  5448.                 mov     al,k
  5449.                 jmp     l4
  5450.  
  5451. l14:            inc     nbits
  5452.                 shl     max_code,1
  5453.                 jmp     l4
  5454.  
  5455. l17:            mov     ax,prefix_code
  5456.                 call    write_code
  5457.  
  5458.                 mov     ax,eof
  5459.                 call    write_code
  5460.  
  5461.                 mov     ax,bit_offset
  5462.                 cmp     ax,0
  5463.                 je      l17a
  5464.  
  5465.                 mov     cx,8
  5466.                 xor     dx,dx
  5467.                 div     cx
  5468.                 or      dx,dx
  5469.                 je      l17a
  5470.  
  5471.                 inc     ax
  5472.  
  5473. l17a:           mov     CompressLength, ax
  5474.  
  5475.                 ret
  5476.  
  5477. Compress        EndP
  5478.  
  5479.  
  5480. init_table      proc    near
  5481.                 mov     nbits,K9
  5482.                 mov     max_code,K512
  5483.  
  5484.                 mov     ax,-1
  5485.                 mov     cx, K256
  5486.                 mov     di,offset next
  5487.         rep     stosw
  5488.  
  5489.                 mov     cx, K256
  5490.                 mov     di,offset first
  5491.         rep     stosw
  5492.  
  5493.                 mov     cx, K256 / 2
  5494.                 mov     di,offset char
  5495.         rep     stosw
  5496.  
  5497.                 mov     free_code,first_free
  5498.                 ret
  5499. init_table      endp
  5500.  
  5501.  
  5502. write_code      proc    near
  5503.                 push    ax
  5504.                 mov     ax,bit_offset
  5505.                 mov     cx,nbits
  5506.                 add     bit_offset,cx
  5507.                 mov     cx,8
  5508.                 xor     dx,dx
  5509.                 div     cx
  5510.  
  5511.                 add     ax,offset IOBuffer+6
  5512.                 mov     di,ax
  5513.                 pop     ax
  5514.                 mov     cx,dx
  5515.                 xor     dx,dx
  5516.                 jcxz    wc3
  5517.  
  5518. wc2:            shl     ax,1
  5519.                 rcl     dx,1
  5520.                 loop    wc2
  5521.  
  5522.                 or      al,byte ptr [di]
  5523.  
  5524. wc3:            stosw
  5525.                 mov     al,dl
  5526.                 stosb
  5527.  
  5528.                 ret
  5529. write_code      endp
  5530.  
  5531.  
  5532. read_char       proc    near
  5533.                 mov     di,input_offset
  5534.                 cmp     di,input_size
  5535.                 jl      rd1
  5536.  
  5537.                 stc
  5538.                 ret
  5539.  
  5540. rd1:            lea     si,DeCompBuffer[di]
  5541.                 lodsb
  5542.                 inc     input_offset
  5543.  
  5544.                 clc
  5545.                 ret
  5546. read_char       endp
  5547.  
  5548.  
  5549. lookup_code     proc    near
  5550.                 mov     si,bx
  5551.                 shl     si,1
  5552.                 mov     di,0
  5553.                 cmp     first [si],-1
  5554.                 je      gc4
  5555.  
  5556.                 inc     di
  5557.                 mov     bx,first [si]
  5558.  
  5559. gc2:            mov     si,bx
  5560.                 shl     si,1
  5561.                 cmp     char [bx],al
  5562.                 jne     gc3
  5563.  
  5564.                 clc
  5565.                 mov     ax,bx
  5566.                 ret
  5567.  
  5568. gc3:            cmp     next [si],-1
  5569.                 je      gc4
  5570.  
  5571.                 mov     bx,next [si]
  5572.                 jmp     gc2
  5573.  
  5574. gc4:            stc
  5575.                 ret
  5576. lookup_code     endp
  5577.  
  5578.  
  5579. add_code        proc    near
  5580.                 mov     bx,free_code
  5581.                 cmp     di,0
  5582.                 je      ac1
  5583.  
  5584.                 mov     next [si],bx
  5585.                 jmp     short ac2
  5586.  
  5587. ac1:            mov     first [si],bx
  5588.  
  5589. ac2:            cmp     bx,maxmax
  5590.                 je      ac3
  5591.  
  5592.                 mov     si,bx
  5593.                 shl     si,1
  5594.                 mov     first [si],-1
  5595.                 mov     next [si],-1
  5596.                 mov     char [bx],al
  5597.  
  5598.                 inc     free_code
  5599.  
  5600. ac3:            ret
  5601. add_code        endp
  5602.  
  5603. ;-----------------------------------------------------------------;
  5604. ;       Subroutine for doing long division                        ;
  5605. ;               dividend in DX:AX                                 ;
  5606. ;               divisor  in BP:BX                                 ;
  5607. ;               quotient placed in DX:AX                          ;
  5608. ;-----------------------------------------------------------------;
  5609.  
  5610. LongDiv         Proc    Near
  5611.                 Mov     CL, 1
  5612. LDiv1:          Xor     SI, SI
  5613.                 Mov     DI, BP
  5614.                 Or      DI, DI
  5615.                 JNZ     LDiv2
  5616.                 Div     BX
  5617.                 XChg    SI, DX
  5618.                 Jmp     LDiv6
  5619. LDiv2:          Push    CX
  5620.                 Mov     CX, 20
  5621.                 Mov     DI, SI
  5622. LDiv3:          SHL     AX, 1
  5623.                 RCL     DX, 1
  5624.                 RCL     SI, 1
  5625.                 RCL     DI, 1
  5626.                 Cmp     DI, BP
  5627.                 JB      LDiv5
  5628.                 JA      LDiv4
  5629.                 Cmp     SI, BX
  5630.                 JB      LDiv5
  5631. LDiv4:          Sub     SI, BX
  5632.                 SBB     DI, BP
  5633.                 Inc     AX
  5634. LDiv5:          Loop    LDiv3
  5635.  
  5636. LDiv6:          Test    CL, 2
  5637.                 JZ      LDiv7
  5638.                 XChg    AX, SI
  5639.                 Mov     DX, DI
  5640. LDiv7:          Test    CL, 4
  5641.                 JZ      LDiv8
  5642.                 Neg     DX
  5643.                 Neg     AX
  5644.                 SBB     DX, 0
  5645.  
  5646. LDiv8:          Ret
  5647. LongDiv         EndP
  5648.  
  5649.  
  5650.  
  5651. ;-----------------------------------------------------------------;
  5652. ;       Handle Program Terminations (Int 20h)                     ;
  5653. ;-----------------------------------------------------------------;
  5654.  
  5655. CloseRemaining  Proc    Near
  5656.  
  5657. ; flush buffers; close any open files
  5658.  
  5659.                 Call    GetOldPID
  5660.                 Call    PutBlock
  5661.                 Call    WritePointerRec
  5662.                 Call    WriteTheCtrlRec
  5663.  
  5664.                 Mov     BX, 0
  5665. DoISR_4:
  5666.                 Cmp     FileHandleTbl [BX], 0FFFFh
  5667.                 JE      DoISR_6
  5668.                 Mov     AX, OldPID
  5669.                 Cmp     AX, PIDTbl [BX]
  5670.                 JNE     DoISR_6
  5671.  
  5672.                 Push    BX
  5673.                 Mov     BX, FileHandleTbl [BX]
  5674.                 CallDOS CloseOP
  5675.                 Dec     FileCount
  5676.                 Pop     BX
  5677.                 Mov     FileHandleTbl [BX], 0FFFFh
  5678.  
  5679. DoISR_6:
  5680.                 Inc     BX
  5681.                 Inc     BX
  5682.                 Cmp     BX, MaxHandles * 2
  5683.                 JB      DoISR_4
  5684.  
  5685. DoISR_9:
  5686.                 Mov     DeCompHandle, 0FFFFh
  5687.                 Mov     CtrlHandle,   0FFFFh
  5688.                 Mov     PtrsHandle,   0FFFFh
  5689.  
  5690.                 Ret
  5691. CloseRemaining  EndP
  5692.  
  5693.  
  5694. ;-----------------------------------------------------------------;
  5695. ;       Handle Int 24 Critical Errors here                        ;
  5696. ;-----------------------------------------------------------------;
  5697.  
  5698. ISR24   Proc    Far
  5699.         Mov     CS:CritFlag, 1
  5700.         Mov     AL, 0
  5701.  
  5702.         Cmp     CS:DOSVersion, 3
  5703.         JB      ISR24Exit
  5704.  
  5705.         Mov     AL, 3
  5706.  
  5707. ISR24Exit:
  5708.         IRet
  5709.  
  5710. ISR24   EndP
  5711.  
  5712.  
  5713. ;-----------------------------------------------------------------;
  5714. ;       Intercept Int20 (Terminate) call                          ;
  5715. ;-----------------------------------------------------------------;
  5716.  
  5717. ISR_20:
  5718.                 STI
  5719.                 Push    DS
  5720.                 Push    ES
  5721.  
  5722.                 Push    CS              ; addressability to this segment
  5723.                 Pop     DS
  5724.                 Push    DS
  5725.                 Pop     ES
  5726.                 CLD
  5727.  
  5728.                 Call    CloseRemaining
  5729.  
  5730.                 Pop     ES
  5731.                 Pop     DS
  5732.  
  5733.                 Mov     AX, 4C00h
  5734. ISR20Exit:      Jmp     CS:OldInt21 
  5735.  
  5736.  
  5737.  
  5738.  
  5739. ;-----------------------------------------------------------------;
  5740. ;       Our stack (we don't want to trample someone else's!)      ;
  5741. ;-----------------------------------------------------------------;
  5742.  
  5743. OurStack        DB      256 dup("STACK ")
  5744. EndStack        DW      0
  5745.  
  5746. ;-----------------------------------------------------------------;
  5747. ;       The following location is the last resident byte          ;
  5748. ;-----------------------------------------------------------------;
  5749.  
  5750. EndOfResident   Label   Byte
  5751.  
  5752. ;-----------------------------------------------------------------;
  5753. ;                                                                 ;
  5754. ;       The following is non-resident code/data.  It checks       ;
  5755. ;       whether Diet Disk is already in memory, and either        ;
  5756. ;       says "Already loaded!" or it installs the resident        ;
  5757. ;       portion.                                                  ;
  5758. ;                                                                 ;
  5759. ;-----------------------------------------------------------------;
  5760.  
  5761. Start:          Push    CS
  5762.                 Pop     DS
  5763.                 Call    Installed
  5764.                 JNC     AlreadyThere
  5765.                 Jmp     NotPresent              ; nope, it's okay to install
  5766.  
  5767. AlreadyThere:   Mov     AH, WriteOp
  5768.                 Mov     BX, StdOut
  5769.                 Mov     DX, Offset Msg2
  5770.                 Mov     CX, Msg2Siz
  5771.                 Int     21h                     ; "We're already loaded!" message
  5772.  
  5773.                 Mov     AX, 4C00h               ; exit, we're already loaded.
  5774.                 Int     21h
  5775.  
  5776. ;
  5777. ; change vectors, etc. as necessary to install ourselves
  5778. ;
  5779.  
  5780. NotPresent:     Mov     AX, 5100h               ;to get current PSP from DOS
  5781.                 Int     21h                     ;PSP now in BX
  5782.                 Mov     OurPID,bx               ;save our PSP
  5783.  
  5784.                 Mov     AH, 30h                 ; remember DOS version
  5785.                 Int     21h
  5786.                 Mov     DOSVersion, AL
  5787.                 Mov     DOSVersMin, AH
  5788.  
  5789.                 Mov     OurSS, DS               ; remember our ss/sp
  5790.                 Mov     AX, Offset EndStack
  5791.                 Dec     AX
  5792.                 Dec     AX
  5793.                 Shl     AX, 1
  5794.                 Shr     AX, 1
  5795.                 Mov     OurSP, AX
  5796.  
  5797.                 Mov     AH, GetDTAOp            ; get DTA address
  5798.                 Int     21h
  5799.                 Mov     OurDTAOfs, BX
  5800.                 Mov     OurDTASeg, ES
  5801.  
  5802.                 Mov     AX, 3521h               ; Get address of int 21
  5803.                 Int     21h
  5804.                 Mov     Word Ptr OldInt21Ofs, BX
  5805.                 Mov     Word Ptr OldInt21Seg, ES
  5806.  
  5807.                 Mov     AX, 3520h               ; Get address of int 20
  5808.                 Int     21h
  5809.                 Mov     Word Ptr OldInt20Ofs, BX
  5810.                 Mov     Word Ptr OldInt20Seg, ES
  5811.  
  5812.                 Push    DS
  5813.                 Pop     ES
  5814.  
  5815.                 Mov     AH, CurrentDiskOp           ; generate <d>:
  5816.                 Int     21h
  5817.                 Add     AL, "A"
  5818.                 Mov     AH, ":"
  5819.                 Mov     Word Ptr DietPath, AX
  5820.                 Mov     DietPath+2, '\'
  5821.  
  5822.                 Mov     SI, Offset DietPath
  5823.                 Inc     SI
  5824.                 Inc     SI
  5825.                 Inc     SI
  5826.                 Mov     DL, 0
  5827.                 Mov     AH, GetCurrDir
  5828.                 Int     21h
  5829.  
  5830.                 Mov     DI, Offset DietPath
  5831.                 Mov     CX, MaxName
  5832.                 Mov     AL, 0
  5833.         RepNE   ScaSB
  5834.                 Dec     DI
  5835.                 Cmp     Byte Ptr [DI-1], '\'
  5836.                 JE      DoDietName
  5837.                 Mov     Byte Ptr [DI], '\'
  5838.                 Inc     DI
  5839.  
  5840. DoDietName:     Mov     SI, Offset DietDir
  5841.                 Mov     CX, LDietDir
  5842.         Rep     MovSB
  5843.  
  5844.                 Cmp     DOSVersion, 3
  5845.                 JB      CantShare
  5846.                 Cmp     DOSVersMin, 1
  5847.                 JB      CantShare
  5848.  
  5849.                 Mov     BL, 3
  5850. TestNextDrive:
  5851.                 Mov     AX, 4409h
  5852.                 Int     21h
  5853.                 Test    DX, 1000h
  5854.                 JNZ     YesNetwork
  5855.                 Inc     BL
  5856.                 Cmp     BL, 21
  5857.                 JB      TestNextDrive
  5858.  
  5859.                 Jmp     Short CantShare
  5860.  
  5861. YesNetwork:
  5862.                 Mov     RD_ONLY, 40h
  5863.                 Mov     RD_WR,   42h
  5864.                 Mov     DX, offset DietPath
  5865.                 Mov     AL, RD_ONLY
  5866.                 Mov     AH, OpenOp
  5867.                 Int     21h
  5868.                 JNC     SaveDietHandle
  5869.  
  5870. CantShare:
  5871.                 Mov     RD_ONLY, 00
  5872.                 Mov     RD_WR,   02
  5873.  
  5874. OpenDietControl:
  5875.                 Mov     DX, offset DietPath
  5876.                 Mov     AL, RD_ONLY
  5877.                 Mov     AH, OpenOp
  5878.                 Int     21h
  5879.                 JNC     SaveDietHandle
  5880.  
  5881.                 Xor     AX,AX                   ; doesn't exist
  5882.  
  5883. SaveDietHandle:
  5884.                 Mov     DietDirHandle, AX
  5885.                 Cmp     AX, 0
  5886.                 JE      NoDirFileMode
  5887.  
  5888.                 Mov     BX, DietDirHandle
  5889.                 Mov     AH, 3Eh
  5890.                 Int     21h
  5891.  
  5892.                 Cmp     RD_ONLY, 0
  5893.                 JE      StandaloneMode
  5894.  
  5895.                 Mov     CX, Msg3Siz
  5896.                 Mov     DX, Offset Msg3
  5897.                 Jmp     Short StateTheMode
  5898.  
  5899. NoDirFileMode:
  5900.                 Mov     CX, Msg5Siz
  5901.                 Mov     DX, Offset Msg5
  5902.                 Jmp     Short StateTheMode
  5903.  
  5904. StandaloneMode:
  5905.                 Mov     CX, Msg4Siz
  5906.                 Mov     DX, Offset Msg4
  5907.  
  5908. StateTheMode:
  5909.                 Mov     AH, WriteOp
  5910.                 Mov     BX, StdOut
  5911.                 Int     21h
  5912.  
  5913.                 Mov     AH, WriteOp
  5914.                 Mov     BX, StdOut
  5915.                 Mov     DX, Offset Msg1
  5916.                 Mov     CX, Msg1Siz
  5917.                 Int     21h                     ; "We're loaded" message
  5918.  
  5919.  
  5920. ;
  5921. ; now terminate, but stay resident
  5922. ;
  5923.                 Mov     DX, offset ISR_21       ; make it point to our routine
  5924.                 Mov     AX, 2521h
  5925.                 Int     21h
  5926.  
  5927.                 Mov     DX, offset ISR_20
  5928.                 Mov     AX, 2520h
  5929.                 Int     21h
  5930.  
  5931.                 Mov     DX, offset EndOfResident
  5932.                 Mov     CX, 4h
  5933.                 Shr     DX, CL          ; Turn byte addr. into paragraphs
  5934.                 Add     DX, 1           ; round up by 1 paragraph
  5935.                 Mov     AH, 31h
  5936.                 Mov     AL, 0
  5937.                 Int     21h             ; terminate/stay resident
  5938.  
  5939. ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
  5940.  
  5941. Installed       Proc    Near
  5942.                 Mov     AX, 3341h
  5943.                 Int     21h
  5944.                 Cmp     DX, 1234h
  5945.                 JNE     NotInst
  5946.  
  5947. InstAlready:    CLC
  5948.                 Ret
  5949.  
  5950. NotInst:        STC
  5951.                 Ret
  5952. Installed       EndP
  5953.  
  5954. ;-----------------------------------------------------------------;
  5955. ;                                                                 ;
  5956. ;       Non-resident data area                                    ;
  5957. ;                                                                 ;
  5958. ;-----------------------------------------------------------------;
  5959. Msg1            DB      13,10
  5960.                 DB      "Diet Disk is loaded. (V 1.0)."
  5961.                 DB      13,10
  5962.                 DB      "Distributed from BIX: the BYTE Information Exchange"
  5963.                 DB      13,10
  5964. Msg1Siz         =       $-Msg1
  5965.  
  5966. Msg2            DB      13,10
  5967.                 DB      "Diet Disk is already running."
  5968.                 DB      13,10
  5969. Msg2Siz         =       $-Msg2
  5970.  
  5971. Msg3            DB      13,10
  5972.                 DB      "Diet Disk is in file-sharing mode."
  5973.                 DB      13,10
  5974. Msg3Siz         =       $-Msg3
  5975.  
  5976. Msg4            DB      13,10
  5977.                 DB      "Diet Disk is in non-file-sharing mode."
  5978.                 DB      13,10
  5979. Msg4Siz         =       $-Msg4
  5980.  
  5981. Msg5            DB      13,10
  5982.                 DB      "No DIET.DIR file was found."
  5983.                 DB      13,10
  5984. Msg5Siz         =       $-Msg5
  5985.  
  5986. EndOfProgram    =       $
  5987.  
  5988. PSP             EndS
  5989.                 End     Program
  5990.  
  5991.  
  5992.